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

  FORUM HardWare.fr
  Programmation
  C

  Question sur select()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question sur select()

n°658601
EpoK
Let's burn
Posté le 28-02-2004 à 16:47:16  profilanswer
 

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
mood
Publicité
Posté le 28-02-2004 à 16:47:16  profilanswer
 

n°658630
Konar
Posté le 28-02-2004 à 17:19:00  profilanswer
 

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

n°659227
EpoK
Let's burn
Posté le 29-02-2004 à 13:21:49  profilanswer
 

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 ?

n°659367
Konar
Posté le 29-02-2004 à 16:42:54  profilanswer
 

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.

n°659460
EpoK
Let's burn
Posté le 29-02-2004 à 18:36:21  profilanswer
 

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 ?

n°659613
Konar
Posté le 29-02-2004 à 20:38:31  profilanswer
 

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


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

  Question sur select()

 

Sujets relatifs
[C] gestion des timeout sous Unix avec select()petite question avec GTK
bonjour, est il possible de vous poser une question a propos de CSS ??[JAVA] Question à propos des FlowLayout()
[Oracle 9.2] pb de select from dual sur oracle 9.2[C] Question sur strtol (conversion de char* en int)
[Visual C++] Question (basique) sur les CPenQuestion Parsage avec SAX ...
[Mysql] problème avec SELECT WHERE INcréer et ouvrir une requete SELECT en VBA
Plus de sujets relatifs à : Question sur select()


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