IPB

Bienvenue invité ( Connexion | Inscription )

> Programmation

Il est interdit de poster directement à la racine de ce forum.
Veuillez créer votre topic dans le sous-forum approprié.

> C'est quoi ce bordel!, select sur un socket bsd
Options
protheus
posté 22 Jul 2004, 22:44
Message #1


Adepte de Macbidouille
*

Groupe : Membres
Messages : 71
Inscrit : 10 Sep 2001
Lieu : Paris
Membre no 768



Je ne comprend pas,ds le code suivant :

CODE

do
{
 //Boulce de reception.
 FD_ZERO(&readfds);
 if(sock >= 0)
 {
  FD_SET(sock, &readfds);
 }
 nfds = sock +1;
 timeout.tv_sec = 5;   // 5 secondes
 timeout.tv_usec = 500000; // 0.5 secondes
 int z = 0;
 
 do
 {
  openlog("SibFunct",LOG_PID | LOG_CONS, LOG_USER);
  syslog(LOG_ERR,"Selection sur n° %d",sock);
  z = select(nfds,&readfds ,NULL, NULL, &timeout);
  syslog(LOG_ERR,"Resultat de la selection sur n° %d , nb de déscritpeur(s) prés : %d",sock,z);
 }while(z == -1 && errno ==EINTR && !FD_ISSET(sock,&readfds));
 if(z == -1)
 {
  openlog("SibFunct",LOG_PID | LOG_CONS, LOG_USER);
  syslog(LOG_ERR,"Erreur sur la disponibilitée du socket n° %d",sock);
  closelog();
  close(sock);
  exit(-1);
 }
 
 if(z == 0)
 {
  syslog(LOG_ERR,"Sortie de la boucle de lecture sur le socket n° %d",sock);
  closelog();
  close(sock);
  exit(0);
 }
.... traitements divers et avariés

}while(sock >= 0);
return;


Le socket devrait se mettre en attente lorsque le tampon de lecture est vide, sauf que lorsque cela arrive, l'utilisation CPU s'embale et il boucle indéfiniment sur une selection.... j'ai beau vider le tampon, c'est comme s'il rester tt le temps 1 octet !!!

QQun à une idée?


--------------------
1 BSD Box ;-) Free 5.2.1
1 Alu 15" 1.5
2 IBM T20 700/256/16
1 Cadavre de Silicon Graphics VW320 2*500/256/120Go
et des poussieres...
Go to the top of the page
 
+Quote Post
 
Start new topic
Réponse(s)
buserror
posté 23 Jul 2004, 11:07
Message #2


Macbidouilleur d'Or !
*****

Groupe : Banned
Messages : 1 559
Inscrit : 19 May 2002
Lieu : Gone
Membre no 2 507



Dans ce cas c'est parce que tu lis pas tout ce qui est dispo dans le buffer. Si tu fais ca select va retourner immediatement avec le meme flag. select() ne renvoie pas des *evenements* il renvoie des *status* sur les sockets.


--------------------
Manual Focus Forum pour les fans d'appareils & objectifs a papa...
Go to the top of the page
 
+Quote Post

Les messages de ce sujet


Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 13th June 2024 - 13:19