Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1129 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [SOCKETS] Pb utilisation select ()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SOCKETS] Pb utilisation select ()

n°1011136
barbaputas
Wtf ?!
Posté le 13-03-2005 à 11:35:35  profilanswer
 

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
mood
Publicité
Posté le 13-03-2005 à 11:35:35  profilanswer
 

n°1011170
fabs0028
Posté le 13-03-2005 à 13:16:34  profilanswer
 

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).

n°1011394
barbaputas
Wtf ?!
Posté le 13-03-2005 à 18:38:50  profilanswer
 

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.

n°1013714
barbaputas
Wtf ?!
Posté le 15-03-2005 à 18:03:18  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [SOCKETS] Pb utilisation select ()

 

Sujets relatifs
[C++] Utilisation de memcpy[MySQL 4.0.15] SELECT imbriqués : erreur
utilisation du shell en vba pour outlookFonction select() sur l'entrée std
PROBLEME REQUETE: SELECT nom FROM (plusieur table)[SOCKETS UNIX] Ecriture/Lecture
Select pour Socketsutilisation du crypt
[SGBD] select * from matable order by @var 
Plus de sujets relatifs à : [SOCKETS] Pb utilisation select ()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR