Bind bought bought lier

Signaler
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
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

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Met un peu des WSAGetLastError() apres la creation du socket, apres le bind(), apres listen().
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007

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+
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
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.