interrompre un read ou un recv

interrompre un read ou un recv - C++ - Programmation

Marsh Posté le 15-07-2002 à 11:26:18    

Bonjour,  
Un client doit envoyer une information à un serveur dans un buffer  
Dans le programme du client, il y a un send(buffer) ou un write(buffer)  
Dans le programme du serveur, il y a un recv(buffer) ou un read(buffer)  
Je voudrais faire en sorte que si au bout d'un certain temps, la socket du serveur ne reçoit toujours rien, on passe à
l'instruction suivante plutôt que de rester bloqué sur le recv ou le write  
 
Je ne sais pas comment faire

Reply

Marsh Posté le 15-07-2002 à 11:26:18   

Reply

Marsh Posté le 15-07-2002 à 11:42:09    

Tu bosse sous quel system?
 
Si c sous unix y a une fonction qui le fait (j'ai oublié son nom pour l'instant mais ça va me revenir)


---------------
Le Tyran
Reply

Marsh Posté le 15-07-2002 à 11:50:20    

Je bosses sous Linux
Je vais aller manger et j'espère que ton cerveau aura pu retrouver la fonction quand je reviendrais :D

Reply

Marsh Posté le 15-07-2002 à 11:52:06    

Ca doit être select me semble son nom, ça te permet d'écouter simultanément plusieur entrée et de réagir dès qu'une est solicitée ou au bout d'un certain temps.


---------------
Le Tyran
Reply

Marsh Posté le 15-07-2002 à 13:29:16    

regarde du coté de fcntl et ioctl ;)

Reply

Marsh Posté le 15-07-2002 à 13:30:39    

Code :
  1. fcntl(sock,F_SETFL,O_NONBLOCK|fcntl(sock,F_GETFL)); //accept n'est plus bloquant
  2. fcntl(sock,F_SETFL,!(O_NDELAY)&fcntl(sock,F_GETFL)); // accept redevient blocant

Reply

Marsh Posté le 15-07-2002 à 22:35:28    

letoII a écrit a écrit :

Ca doit être select me semble son nom, ça te permet d'écouter simultanément plusieur entrée et de réagir dès qu'une est solicitée ou au bout d'un certain temps.




 
Oui. Et quand "select" reagit, tu es sur qu'il y a des donnees a lire et que "recv" ne sera pas bloquant.
 
Quand a moi j'utilise (au risque de me repeter :) ) la lib ACE (enfin, quand je peux) qui encapsule "select" de belle facon objet.
 
http://www.cs.wustl.edu/~schmidt/ACE.html

Reply

Marsh Posté le 16-07-2002 à 23:43:51    

walla un exemple simple d utilisation de select :
 

Code :
  1. void read_socket(int sock)
  2. {
  3.   int sel;
  4.   fd_set r;
  5.   struct timeval timeout;
  6.   timeout.tv_sec = 2; // initialise le timeout, ici 2 sec
  7.   timeout.tv_usec = 0; // les milisecondes
  8.   while (42)
  9.   {
  10. // pour l'utilisation de select, il faut :
  11. //  - spécifier le plus de tous les filedescriptor à surveiller plus 1
  12. //  - créer un liste de file descriptor à surveiller
  13. //  - indiquer un timeout
  14.      FD_ZERO(&r); // initialise la liste de fd
  15.      FD_SET(sock, &r); // ajoute la socket dans la liste des fd
  16.      sel = select(sock + 1, &r, NULL, NULL, &timeout);
  17.      if (sel < 0) // select a rencontré une problème
  18.      {
  19.         perror("select" );
  20.         exit(1);
  21.      }
  22.      else if (sel == 0) // select est sorti a cause du timeout
  23.      {
  24.          // code si rien a lire sur socket
  25.      }
  26.      else // quelque chose à lire sur un file descriptor
  27.      {
  28.         if (FD_ISSET(sock, &r)) // si la socket est prete à être lue
  29.         {
  30.             // code de lecture : recv ou read
  31.         }
  32.      }
  33.   }
  34. }


 
 
pour plus d info sur select, il n y a qu une solution :  
 
MAN SELECT


---------------
WoIP - Video and Voice over IP -  http://www.woip.net/
Reply

Sujets relatifs:

Leave a Replay

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