Double socket

Fermé
Sivaller Messages postés 124 Date d'inscription dimanche 1 juillet 2007 Statut Membre Dernière intervention 13 mai 2011 - 1 août 2008 à 11:32
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 1 août 2008 à 15:43
Bonjour,

Bonjour,

Il y a quelque chose que je ne comprend pas,
j'ai conçu un projet Client/Server , et
le programme client utilise 2 sockets TCP (un pour les requete distante) , l'autre pour les messages (message administratives,message arret serveur,message deconnexion). Le programme client se connecte 2 fois et meme port pour avoir 2 sockets.

Ce que je ne comprend pas Winsock retourne au niveau du serveur une erreur comme quoi le socket distance à été déconnecté et que ce n'est pas le cas.

Pourtant les 2 sockets sont en mode keep-alive au client et serveur.
Dans le programme client j'utilise ioctlsocket et recv pour recevoir les données et au serveur j'utilise wsaasyncselect.

Programme client :

Code :
int connectserver(char* host)
{
sockaddr_in skaddr;
tv.tv_sec = 30000; /* 30 Secs Timeout */
int hsocket;
hsocket=socket(Internet,Stream,0);
if (hsocket!=-1)
{
ZeroMemory(&skaddr,sizeof(skaddr));
skaddr.sin_family=Internet;
skaddr.sin_port=swap(1002);
unsigned long l=HostToLong(host);
skaddr.sin_addr.S_un.S_addr=l;
if (connect(hsocket,(sockaddr*)&skaddr,sizeof skaddr)!=0)
{
closesocket(hsocket);

return 0;
}

setsockopt(hsocket, SOL_SOCKET, SO_RCVTIMEO,(const char*)&tv,sizeof(struct timeval));
setsockopt(hsocket, SOL_SOCKET, SO_SNDTIMEO,(const char*)&tv,sizeof(struct timeval));

BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
int iOptVal;
int iOptLen = sizeof(int);
setsockopt(hsocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&bOptVal, bOptLen);


return hsocket;
}
return 0;
}

Programme serveur en Pascal

Code :
case msg.lParam of
FD_ACCEPT: begin
// log('Demande de connexion');
//if (nombreconnection+1<=nombreconnectionmax) then begin
// inc(nombreconnection);
scknew := accept(msg.wparam,0,0);
setcode(scknew,$4555);
i := getcode(scknew);;
// sendbuf(msg.wparam,@i,2);
WSAASyncSelect(scknew,principale.Handle,WM_USER,FD_CLOSE or FD_CONNECT or FD_ACCEPT or FD_READ);
tv.tv_sec := 5000;
tv.tv_usec := 500;
setsockopt(scknew, SOL_SOCKET, SO_RCVTIMEO,@tv,sizeof(tv));
setsockopt(scknew, SOL_SOCKET, SO_SNDTIMEO,@tv,sizeof(tv));
bk := true;
setsockopt(scknew, SOL_SOCKET, SO_KEEPALIVE, @bk, 1);
//end else
// closesocket(msg.WParam);


end;
FD_CONNECT:begin
// nombreconnection := nombreconnection;

end;

Je ne comprend pas pourquoi ca deconnecte au niveau du client pourtant je ne ferme pas le socket.

Merci de votre aide.
A voir également:

1 réponse

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
1 août 2008 à 15:43
créer deux sockets identiques me paraît étrange, inutile et dangeureux.
lorsqu'un paquet IP arrive comment l'ordinateur fait il pour savoir à quelle socket l'attribuer puisque rien ne les distingue ? (l'en-tête IP, ne contient que l'IP destination et le port.)
1