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.