Double socket

Double socket - API Win32 - Programmation

Marsh Posté le 01-08-2008 à 11:42:51    

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.

Reply

Marsh Posté le 01-08-2008 à 11:42:51   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed