Question sur select()

Question sur select() - C - Programmation

Marsh Posté le 28-02-2004 à 16:47:16    

bonjour,
 
je doit réalisé un server en C qui répond à des requette http sur deux port différent, pour cela l'utilisation de select est imposé.
 
je cré donc mon select avec mes deux socket dedans, et quand il déboucle j'ai :
 

Code :
  1. if (FD_ISSET(sock1, &prets)) {
  2. ...
  3. }
  4. else if (FD_ISSET(sock2, &prets)) {
  5. ...
  6. }


 
ca marche tres bien mon server arrive a rendre le service sur les deux port.
 
le probleme vien du fait que le server doit afficher dans la console des stat toute les n secondes.
 
j'ai d'abord pensé avec un sigalrm, mais comme select read etc sont des i/o ca me les fait planter, et il faudrai que je teste errno = EIRN ou je sais plus quoi, bref ca me soule un peu.
 
 
j'ai donc feinté en mettant mon timeout de select a n seconde du coup je fait :
 

Code :
  1. if (FD_ISSET(sock1, &prets)) {
  2. ...
  3. }
  4. else if (FD_ISSET(sock2, &prets)) {
  5. ...
  6. }
  7. else {
  8. stats();
  9. }


 
mais le problem c'est que quand un client utilise le service le select boucle et le timeout n'arrive jamais.
 
vous voyez une solution pas trop compliqué ?


Message édité par EpoK le 28-02-2004 à 16:47:38
Reply

Marsh Posté le 28-02-2004 à 16:47:16   

Reply

Marsh Posté le 28-02-2004 à 17:19:00    

je t'aurais bien dit "avec des threads", c'est ce qu'y a de plus logique.
 
sinon une autre solution :  tu fais ton select (avec un timer de x msec), puis après le traitement du select, tu utilises un compteur pour appeler une fonction toutes les n secondes. comme ca c'est indépendant des connexion clients.
 
schématisé :
 - select(), avec un timer de 100 ms par ex
 - traitement() du select
 - incrémentation d'un compteur, selon la durée écoulée
 - si compteur > 2 sec, tu fais ton bordel.
 
bon je m'exprime mal, mais bon c'est assez simple a comprendre...

Reply

Marsh Posté le 29-02-2004 à 13:21:49    

Konar a écrit :

je t'aurais bien dit "avec des threads", c'est ce qu'y a de plus logique.
 
sinon une autre solution :  tu fais ton select (avec un timer de x msec), puis après le traitement du select, tu utilises un compteur pour appeler une fonction toutes les n secondes. comme ca c'est indépendant des connexion clients.
 
schématisé :
 - select(), avec un timer de 100 ms par ex
 - traitement() du select
 - incrémentation d'un compteur, selon la durée écoulée
 - si compteur > 2 sec, tu fais ton bordel.
 
bon je m'exprime mal, mais bon c'est assez simple a comprendre...
 


 
j'ai pas le droit au thread :/
 
ben c'est ce que je pensais faire mais j'ai pas le meme probleme ?
 
c'est a dire que le compteur sera incrémenté a chaque appel du select et pas forcement toute les 100ms du timeout, vu que le select déboucle dès que j'ai un accept sur un de mes socket.
 
ca marche si le select déboucle vraiment que toute les 100ms ce qui est pas possible pour qu'il puisse rendre son service, non ?

Reply

Marsh Posté le 29-02-2004 à 16:42:54    

me suis mal exprimé : il faut incrementer ton compteur selon le temps qu'il s'est écoulé depuis l'appel a select, et non pas avec le timeout du select lui meme.
de cette manière tu as une sorte de compteur indépendant de ce qui se passe dans le select.

Reply

Marsh Posté le 29-02-2004 à 18:36:21    

Konar a écrit :

me suis mal exprimé : il faut incrementer ton compteur selon le temps qu'il s'est écoulé depuis l'appel a select, et non pas avec le timeout du select lui meme.
de cette manière tu as une sorte de compteur indépendant de ce qui se passe dans le select.


 
wha ca soule :/
 
ya pas un moyen de rendre les i/o insensible au signal ?

Reply

Marsh Posté le 29-02-2004 à 20:38:31    

EpoK a écrit :


 
wha ca soule :/
 
ya pas un moyen de rendre les i/o insensible au signal ?


utiliser un vrai os.
 
sinon c'est vrai que c'est compliqué a faire :

Code :
  1. TypeALACon CompteurALacon = FctALaCon(); // Fct qui par ex te renvoie un temps, genre un nb de secondes
  2. while ()
  3. {
  4.   int ret = select();
  5.   // traitement du select...
  6.   if ((FctALaCon() - CompteurALacon) > IntervalleMax)
  7.   {
  8.     // ré-init compteur
  9.     CompteurALacon = FctALaCon();
  10.   }
  11. }

Reply

Sujets relatifs:

Leave a Replay

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