NAVIE
Messages postés23Date d'inscriptionsamedi 1 janvier 2005StatutMembreDernière intervention23 avril 2006
-
27 févr. 2005 à 20:47
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011
-
27 févr. 2005 à 21:53
Bonjour, voilà mon souci: a l'aide de mon compilateur Dev-C++ Version 4.9.8.10 j'ai crée un socket qui sert de serveur. Cependant même si la compilation a été bonne, mon programme n'arrive pas à mettre en place le serveur. J'ai d'abord désactivé mon firewall mais cela a donné quand même le même résultat. Je me suis dit alors que peut-être cela vient de mon code; le voici:
#include
#include <winsock2.h>#include <conio.h><?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 27 févr. 2005 à 21:53
Premièrement, si ton WSAStartup() échoue, WSAGetLastError() n'est pas disponible:
int ret;
WSADATA wdata;
/*
WSAStartup() renvoie 0 si succès sinon, le code d'erreur
*/
if ( (ret = WSAStartup( WINSOCK_VERSION, &wdata )) )
{
cout << "error => " << ret << endl;
return 0;
}
/* notre version n'est pas disponible, pour éviter tout problème, on quitte */
if ( LOBYTE(WINSOCK_VERSION) != LOBYTE(wdata.wVersion) )
{
cout << "error => " << WSAVERNOTSUPPORTED << endl;
WSACleanup();
return 0;
}
/* faut pas oublier de lier la librairire aussi, sous Dev-C++ son nom est `libws2_32.a` je crois */
ensuite, pour créer un socket de type SOCK_STREAM(tcp/ip):
SOCKET ton_serveur = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );
/* IPPROTO_IP peut être remplacé par 0 tout simplement */
dans ton code, W_IP est ton socket serveur, c'est sur ce dernier que tu dois appliquer le bind() et le listen().
lorsque tu assigne une adresse à la struct `sockaddr_in`, utilise htonl()
TonSockAddrIn.sin_addr.S_un.S_addr = htonl( INADDR_ANY );
pour rendre la chose encore plus `propre`, met le membre .sin_zero à zéro
memset( TonSockAddrIn.sin.zero, 0, sizeof(TonSockAddrIn.sin.zero) );
par la suite, absolument aucune connexion ne pourat être acceptée par ton serveur, ton listen() est à zéro => ne rien accepter
tu as maintenant une queue de 5 connexions simultanées.
tu as aussi la macro SOMAXCONN qui est définie dans winsock2.h
/* exemple: */
listen( W_IP, SOMAXCONN );
tu devrais regarder du coté de la fonction select(), elle te sera très utile.
lorsque tu accept une nouvelle connexion, utilise un autre socket:
sock_client = accept( W_IP, (struct sockaddr *)&client, sizeof(struct sockaddr_in) );
Pour information, sous Windows, le type SOCKET est un entier non signé.
typedef unsigned int SOCKET;
contrairement sous Linux ou c'est un entier signé, alors utilise soit: unsigned int ou SOCKET.