C'est quoi ce bordel!, select sur un socket bsd |
Bienvenue invité ( Connexion | Inscription )
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 |
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... |
|
|
22 Jul 2004, 23:41
Message
#2
|
|
Macbidouilleur d'Or ! Groupe : Banned Messages : 1 559 Inscrit : 19 May 2002 Lieu : Gone Membre no 2 507 |
Il faut que tu geres le cas ou la lecture a l'air valide, mais le nombre d'octet retourne est ZERO; c'est un signal comme quoi la connection a étée coupée, et il faut fermer la socket a ce moment la, sinon ton select() va boucler sans fin.
Ton code est correct ceci dit, -1 est typiquement EINTR, 0 est typiquement le timeout, mais mon nez me dit que tu ne geres pas la detection de déconnection. -------------------- Manual Focus Forum pour les fans d'appareils & objectifs a papa...
|
|
|
23 Jul 2004, 09:29
Message
#3
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 291 Inscrit : 29 May 2004 Lieu : 48°50'27" N, 2°13'43" E Membre no 19 336 |
tout sur les sockets :
http://www.developerweb.net/forum/ Ce message a été modifié par cbrandt - 23 Jul 2004, 09:29. -------------------- Membre no. 14 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
|
|
|
23 Jul 2004, 10:08
Message
#4
|
|
Adepte de Macbidouille Groupe : Membres Messages : 71 Inscrit : 10 Sep 2001 Lieu : Paris Membre no 768 |
QUOTE Ton code est correct ceci dit, -1 est typiquement EINTR, 0 est typiquement le timeout, mais mon nez me dit que tu ne geres pas la detection de déconnection. Benh pourtant si, et de tout façons le "bouclage" infinie (l'inifite loop quoi ;-) ) ce produit alors que la connection est maintenue , entre deux ordres envoyés par le client par exemple. zarb... merci qd même. -------------------- 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... |
|
|
23 Jul 2004, 11:07
Message
#5
|
|
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...
|
|
|
Nous sommes le : 29th March 2024 - 06:39 |