Bind echouant..

lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013 - 14 mai 2007 à 01:08
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 14 mai 2007 à 16:52
Bonsoir, deux applications, bon pour etre original: serveur et client.
Chacune de leur cote effectue ce code:
Serveur:
----------------------
   if(WSAStartup(MAKEWORD(2,0),&WSAData)!=NO_ERROR)
    {
       ...
    }
    ws_sin.sin_family=AF_INET;
    ws_sin.sin_port=htons(port);
    ws_sin.sin_addr.s_addr=INADDR_ANY;
    sock_main=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sock_main==INVALID_SOCKET)
    {
        ...
    }
    if(bind(sock_main,(SOCKADDR *)&ws_sin,sizeof(ws_sin))==SOCKET_ERROR)
    {
        ...
    }
    if(WSAAsyncSelect(sock_main,hwnd,WM_SOCKET,FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE)!=0)
    {
        ...
    }

Client:
----------------------------------
if(WSAStartup(MAKEWORD(2,0),&WSAData)!=NO_ERROR)
    {
        ...
    }
    ws_sin.sin_family=AF_INET;
    ws_sin.sin_port=htons(hport);
    ws_sin.sin_addr.s_addr=inet_addr(host);
    sock_main=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sock_main==INVALID_SOCKET)
    {
        ...
    }
    if(bind(sock_main,(SOCKADDR *)&ws_sin,sizeof(ws_sin))==SOCKET_ERROR)
    {
        ...
    }
    if(WSAAsyncSelect(sock_main,hwnd,WM_SOCKET,FD_ACCEPT)!=0)
    {
        ...
    }

Le probleme est si le port = hport, et supposons que je lance le serveur avant le client, le bind du client echou. Il retourne l erreur WSAEADDRINUSE. Sur MSDN:...only one usage of each socket address (protocol/IP address/port) is permitted...

1)Comment? Pour que mon client se connect a mon serveur il fau bien que port=hport ! Ben apparament MSDN me dit que je peux pas... Cela veu dire que je ne peux pas tester mes applications en locale ?

2)MSDN aussi affirme que pour un client , il n'est pas necessaire de faire un bind...

Merci d'avance

l3KTr0 Was HeRe

4 réponses

lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
14 mai 2007 à 01:17
**correction dans 1):  port = hport --> port != hport
l3KTr0 Was HeRe
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 mai 2007 à 01:58
Salut,

Le truc c'est qu'il n'y a pas un port en jeu dans une connexion, mais
deux: un port distant et un port local (qui vont de paire avec les
adresses ip distantes et locales).

Quand on se connecte a un serveur, le port choisi localement n'a pas
vraiment d'importance, c'est pour ca que le bind est pas vraiment
utile, il est donc choisi au hazard parmis les ports libres par la
fonction connect.
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
14 mai 2007 à 11:01
Le serveur ecoute a un port X. Le client, pour se connecter au serveur, il doit se connecter a l'adresse du serveur et au port X non ?

l3KTr0 Was HeRe
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 mai 2007 à 16:52
Salut,

Exactement, du point de vue du client, le port distant est X, c'est
donc celui la qu'il faut passer dans le connect (avec l'adresse du
serveur). Toujours du point de vue du client, le port local n'est pas
important, donc généralement on ne le choisi pas.

Ce que tu pourrais faire, pour mieux cerner les choses, c'est d'appeler
getsockname et getpeername sur chaque socket du coté client et du coté
serveur (une fois la connection établie), ces deux fonctions affichent
respectivement l'adresse locale et distante attachées a un
socket. 

Normalement tu devrais voir tout ce qu'on a dit plus haut: le port
distant du client sera X, le port local du client sera aleatoire, le
port local du serveur sera X, et le serveur n'a pas de port distant
(getsockname devrait échouer).
0
Rejoignez-nous