Bind bought bought lier

JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007 - 17 août 2003 à 16:08
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 17 août 2003 à 16:57
Salut, j'ai un piti problem de bind, kelkun peut il m'eclairer ?
j'explik : (c'est un client qui se metamorphose en serveur ou en client suivant ce qu'il a reçu etant client (lol))
- je me connecte a mon sevreur (127.0.0.1)
- si il m'envoit le message "HOST" je quitte le serveur et en cree moi meme un nouveau.
- si il m'envoit une ip, je quitte le serveur pour me connecter a un autre.
c'est au moment ou je cree le serveur ke mon bind marche pas, il me semble pourtant avoir tout initialisé correctement ?
De plus c'est pas mon premier serveur donc y'a pas de raison ke ça ne fonctionne pas.
le source :

void join :: HostOrJoin()
{
memset(szBuffer,0,sizeof(szBuffer));
recv ( sCom , szBuffer , LG_BUF , 0 ) ;
if(strcmp("HOST",szBuffer)==0)
{
closesocket(sCom);
WSACleanup () ;
creer_partie() ;
cout << "partie cree. attente d'un joueur..." << endl ;
}
else
{
closesocket(sCom);
WSACleanup () ;
join_partie(szBuffer) ;
cout << "tentative de connexion avec " << szBuffer << endl ;
}
}

void join :: creer_partie()
{
int octet_recu ;
struct sockaddr_in client ;
int taille_adresse = sizeof (struct sockaddr_in) ;
HWND Hwnd = NULL ;
struct sockaddr_in serveur ;

//WSADATA wsaData ;
SOCKET socket_host ;
SOCKET socket_host2 ;

/* initialistaion de sockaddr_in du serveur */
memset ( &serveur , 0 , sizeof ( struct sockaddr_in ) ) ;
serveur.sin_family = AF_INET ;
serveur.sin_port = htons ( 4002 ) ;
serveur.sin_addr.s_addr = INADDR_ANY ;

/* initialistation de ws2_32.dll */
WSAStartup ( MAKEWORD( 2 , 2 ) , &wsaData ) ;

/* ouverture d'un socket de communication */if ( ( socket_host socket ( AF_INET , SOCK_STREAM , IPPROTO_TCP ) ) -1 )
{
cout << "erreur lors de la creation de la socket" << endl ;
Sleep(10000);
exit(-1) ;
}
// else
cout << "numero de socket : " << socket_host << endl ;

if ( bind ( socket_host , (struct sockaddr *)&serveur , taille_adresse ) )
{
cout << "arff encore le bind !!!" << endl ;
Sleep(10000);
exit(-1) ;
}
// else
cout << "bind OK" << endl ;

Sleep(10000) ;
if ( listen ( socket_host , 2 ) == -1 )
{
cout << "erreur de listen" << endl ;
Sleep(10000);
exit(-1) ;
}
// else
cout << "listen OK" << endl ;
Sleep(10000) ;
socket_host2 = accept ( socket_host , (struct sockaddr *)&client , &taille_adresse ) ;
cout << "Un joueur est connecte : " << endl ;
Sleep(10000) ;

closesocket ( socket_host2 ) ;
closesocket ( socket_host ) ;
WSACleanup () ;
}

3 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
17 août 2003 à 16:23
Salut,
Met un peu des WSAGetLastError() apres la creation du socket, apres le bind(), apres listen().
0
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007
17 août 2003 à 16:42
Tiens je connaissais pas cette fonction c'est sympa. :-)
alors il me retourne 10048, j'ai fouiné un peu et il semble donc que l'adresse ip existe deja.
J'ai donc changé le port (qui etait le meme que celui lançé sur ma propre machine) et ça fonctionne a merveille :-)
Je te remerci de m'avoir fait conaitre cette fonction.
bon code
a+
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
17 août 2003 à 16:57
Salut,
10048 c'est l'erreur WSAEADDRINUSE, quand bind() echoue c'est a 99% du temp a cause de ca.
En TCP, tu ne peut pas fermer un socket et tout de suite apres binder un autre socket sur le meme port, car l'adresse locale utilisée par l'ancien socket prend le status TIME_WAIT pendant un petit moment.
0
Rejoignez-nous