[Resolu] timeout sur un recv(...) ca existe?

timeout sur un recv(...) ca existe? [Resolu] - C++ - Programmation

Marsh Posté le 27-03-2003 à 11:13:03    

Dans les sockets, il arrive parfois que le receive attende indefiniment, n'y aurait il pas moyen d'avoir un time out pour arreter le receive apres un certain temps?


Message édité par polo021 le 27-03-2003 à 12:28:14
Reply

Marsh Posté le 27-03-2003 à 11:13:03   

Reply

Marsh Posté le 27-03-2003 à 11:42:31    

ALARM(2)                  Manuel du programmeur Linux                 ALARM(2)
 
NOM
       alarm - Programmer un réveil (timer) pour l'émission d'un signal.
 
SYNOPSIS
       #include <unistd.h>
 
       unsigned int alarm(unsigned int nb_sec);
 
DESCRIPTION
       alarm programme une temporisation pour qu'elle envoie un signal SIGALRM
       au processus en cours dans nb_sec secondes.  Si  le  signal  n'est  pas
       masqué ou intercepté, sa réception terminera le processus.
 
       Les  programmations  successives d'alarmes ne sont pas empilées, chaque
       appel de alarm annule l'éventuelle programmation précédente.
 
       Si nb_sec vaut zéro, aucune alarme n'est planifiée.
 
VALEUR RENVOYÉE
       alarm renvoie le nombre de secondes qu'il restait de  la  programmation
       précédente  (annulée),  ou  zéro si aucune alarme n'avait été planifiée
       auparavant.
 
NOTES
       Les fonctions alarm et setitimer partagent la même temporisation, aussi
       l'appel de l'une interfère avec l'utilisation de l'autre.
 
       sleep()  peut être implémenté en utilisant SIGALRM, aussi il est décon-
       seillé de mélanger les appels alarm() et sleep().
 
       Les délais dûs au  multitâche  peuvent,  comme  toujours,  retarder  le
       déclenchement d'une alarme d'une durée arbitraire.
 
CONFORMITÉ
       SVr4, SVID, POSIX, X/OPEN, BSD 4.3
 
VOIR AUSSI
       setitimer(2),   signal(2),  sigaction(2),  gettimeofday(2),  select(2),
       pause(2), sleep(3)
 
TRADUCTION
       Christophe Blaess, 1997.
 
Linux                            30 Août 2000                         ALARM(2)

Reply

Marsh Posté le 27-03-2003 à 11:47:53    

Suis sous windows CE, merci quand meme.
 
Avec les timers y aurait pas moyen d'imaginer un truc?

Reply

Marsh Posté le 27-03-2003 à 11:58:47    

polo021 a écrit :

Suis sous windows CE


alarm est POSIX! j'ai crû lire quelque part que les wins respectent la norme ...

Reply

Marsh Posté le 27-03-2003 à 11:59:31    

polo021 a écrit :

Suis sous windows CE, merci quand meme.
 
Avec les timers y aurait pas moyen d'imaginer un truc?


 
avec un timer, a part un beau TerminateThread("ton thread ki fait des recv" ), je vois pas...
 
mais je penses plutot ke tu cherches a faire une sorte de recv() ki prenne un parametre temps t et qui quiterait apres t, mais la je vois encore moins... tu peux essayer de chercher du coté des sockets bloquantes ou non (j'ai l'impression ke ce genre de topic a deja été abordé...).

Reply

Marsh Posté le 27-03-2003 à 12:16:39    

polo021 a écrit :

Dans les sockets, il arrive parfois que le receive attende indefiniment, n'y aurait il pas moyen d'avoir un time out pour arreter le receive apres un certain temps?


 
la solution est toute bete en fait : au lieu de faire des recv, tu fais un select, ki va te dire si qqchose est dans le nivo d'etre reçu. alors seulement dans ce cas tu fais un recv.
(le select prends comme parametre un timeout )
 
en fait il ne faut jamais faire de recv() sans que le select() ne t'ai dit qu'il y avait des données pretes a etre recues.
 
un bout de code vite fait ki peut correspondre :
 

Code :
  1. fd_set input_set, exc_set; // Create Input set
  2. int s;
  3. timeval timeout;
  4. timeout.tv_sec = 2; // Attends 2 sec pour returner.
  5. timeout.tv_usec = 0;
  6. while (1)
  7. {
  8. //Set up the input,and exception sets for select().
  9. FD_ZERO(&input_set);
  10. FD_SET(m_Socket, &input_set);
  11. s = select(0 /* vive le c-unix */, &input_set, NULL, NULL, &timeout);
  12. if (s > 0) // Is there data coming in?
  13. {
  14.  // tu fais un recv.
  15. }
  16. if (s == SOCKET_ERROR)
  17. {
  18.  OutputDebugString("SOCKET_ERROR" );
  19.  break;
  20. }
  21. if (s == 0)
  22.  OutputDebugString("no Data coming in" );
  23. }


 
voila, c juste un exemple tout bete.
En plus tu peux specifier plusieurs sockets dans le select, et savoir dans quelle socket faire le recv() grace a la macro FD_ISSET(Socket1, &input_set)).
 
regarde du coté des man : (en plus c pour Win CE)
http://msdn.microsoft.com/library/ [...] select.asp


Message édité par Konar le 27-03-2003 à 12:24:50
Reply

Marsh Posté le 27-03-2003 à 12:27:40    

c'etait bien ca que je cherchais.
 
 :jap: beaucoup

Reply

Sujets relatifs:

Leave a Replay

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