Double socket

cs_sivaller Messages postés 9 Date d'inscription dimanche 24 août 2003 Statut Membre Dernière intervention 28 juillet 2010 - 1 août 2008 à 11:53
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 - 5 août 2008 à 01:22
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.

Sivaller - Cewod Bewod emulateur 80186 + X.M Lanceur de systéme DOS

1 réponse

victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
5 août 2008 à 01:22
Bonjour,

Pour deux connection en simultanées il est préférable d'utiliser 2 thread.
Après tout dépend de tes attentes.

Mais il faut surtout que ces deux connections soient créer sur deux variables différentes.

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
0
Rejoignez-nous