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 C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 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 Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 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.
Partager