[C++] Questions sur les sockets (code inside)

Questions sur les sockets (code inside) [C++] - Programmation

Marsh Posté le 30-01-2002 à 21:12:46    

voici un bout de code de mon serveur pour héberger un client et recevoir des données. Seulement je voudrais quitter la fonction quand le client se déconnecte, et pour cela j'utilise la fonction select() mais je n'arrive pas à savoir si le client est toujours la ou pas !
 
void host_client(void*)
{
 SOCKET a;
 FD_SET set;
 int r,rval;
 char datarcv[255];
 
 a = accept(s,NULL,NULL);
 if(a != INVALID_SOCKET)
 {
  FD_ZERO(&set);
  FD_SET(a,&set);
 
  do
  {
   rval = select(0,&set,0,0,0);
   if(rval == SOCKET_ERROR || !FD_ISSET(a,&set)) //marche pas !
    break; //ICI
   
   r = recv(a,datarcv,sizeof(datarcv),0);
   if(r != SOCKET_ERROR && r != 0)
    //traitement des données reçues
   Sleep(100);
  }
  while(1);
 
  //le client s'est déconnecté
  FD_ZERO(&set);
  closesocket(a);
 }
}
qu'est-ce qui ne va pas avec mon select() ? merci
 ANT

Reply

Marsh Posté le 30-01-2002 à 21:12:46   

Reply

Marsh Posté le 31-01-2002 à 07:51:53    

Qu'est-ce que tu entends par 'ne marche pas'? Qu'est-ce que tu t'attends à trouver? page de 'man select' sur google:
En sortie, les ensembles sont modifiés pour  indiquer  les descripteurs qui ont changé de statut.
 
Donc tu peux en déduire que si ton client se déctonnecte, alors la fonction va retourner 1, qui est le nombre de sockets pour lesquelles select a détécté un évènement.
Alors, tu va chercher de quelle socket il s'agit (avec en effet FD_ISSET). Une fois que tu connais la socket, alors tu fais un 'read' dessus. Si la fonction read te dis q'en fait il n'y a pas de data, alors c'est que la socket a été fermée par le client.
 
je ne veux pas te donner de code parce que je n'en ai pas sous la main et ce fait un moement que je n'ai pas manipulée un bout de code avec des sockets.
Mais j'espere que cela te mettra sur la piste.
 
a+

Reply

Marsh Posté le 31-01-2002 à 13:05:09    

Je te remercie beaucoup, c'est très clair (j'avais pas tout compris au sujet de la fonction select()), mais j'ai juste une question : je suis sous windows et il n'y a pas à priori de fonction read(), donc que dois-je utiliser à la place ? recv() ?
merci pour tout
   ANT  :hello:

Reply

Sujets relatifs:

Leave a Replay

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