[SOCKETS] Pb utilisation select ()

Pb utilisation select () [SOCKETS] - C++ - Programmation

Marsh Posté le 13-03-2005 à 11:35:35    

Bonjour à tous.
 
Je commence mes balbutiements en programmation réseau. Pour le moment, mon client/serveur fonctionne (sous Linux et Windows), cela consiste juste à faire quelque de tres simple en passant du texte du client vers le serveur et du serveur vers le client. Pour le moment tout fonctionne, il me faut maintenant gérer les timeout. Après quelques recherches sur le forum, il semble que select() soit la fonction à utiliser (en plus c'est portable windows/Linux ce qui est parfait pour mes besoins).
 
Cependant je n'arrive pas à l'utiliser correctement.
 
Voici le code approximatif du serveur(pour Linux et Win) :

Code :
  1. socketd = socket (...);
  2.   bind (....);
  3.   listen (...);
  4.   for (;;)
  5.   {
  6.      SockClient=accept(Socketd,....);
  7.      Nblus= read () ou recv ();
  8.      write(...) ou send ();
  9.      divers traitements;
  10.      Close(SockClient);
  11.   }


 
Code du client :

Code :
  1. Socketd = socket (...);
  2.      connect ();
  3.      send ();
  4.      fd_set set_rcv;
  5.      struct timeval tv;
  6.      FD_ZERO(&set_rcv);
  7.      FD_SET(Socketd, &set_rcv);
  8.      tv.tv_sec = 5; tv.tv_usec = 0; // Timeout 5 sec
  9.    
  10.      while (1)
  11.      {
  12.         FD_ZERO(&set_rcv);
  13.         FD_SET(Socketd, &set_rcv);
  14.         retval = select (0, &set_rcv, NULL,NULL,&tv); //Windows
  15.         // Linux => retval = select (FD_SETSIZE, &set_rcv, NULL,NULL, &tv)
  16.         if (retval > 0)
  17.         {
  18.            NbLus = recv(Socketd, Tampon, sizef(Tampon), 0);
  19.            break; // je veux qu'un seul receive
  20.         }
  21.       }
  22.       if (!retval) { exit; //(on a un timeout)}


 
Le pb c'est que je tombe sur une boucle infinie. Si j'enleve la boucle, je tombe forcement sur un timeout.
 
Fct : le client envoi un code au serveur, le serveur le recoit et le traite, renvoit la reponse au client.


Message édité par barbaputas le 15-03-2005 à 18:04:39
Reply

Marsh Posté le 13-03-2005 à 11:35:35   

Reply

Marsh Posté le 13-03-2005 à 13:16:34    

Bonjour,
c'est normal que tu tombes sur une boucle infinie car select modifie le fd_set après chaque appel pour indiquer d'où proviennent les évènements ( a l'aide de la macro FD_ISSET ).
 
Pour que ça fonctionne il faut que tu réinitialises ton set apres chaque select (FD_SET).

Reply

Marsh Posté le 13-03-2005 à 18:38:50    

J'ai completement oublié de le noter dans le code, je fais effectivement une remise à zero dans la boucle juste avant l'utilisation du select.

Reply

Marsh Posté le 15-03-2005 à 18:03:18    

J'ai enfin reussi à faire fonctionner mon select() sous Linux.
Par contre sous windows, rien à faire, ce select() semble ne pas vouloir se faire.

Reply

Sujets relatifs:

Leave a Replay

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