je ne sort pas de la boucle de recv() dans mon client

je ne sort pas de la boucle de recv() dans mon client - C - Programmation

Marsh Posté le 17-03-2004 à 10:52:52    

bonjour à tout le monde
 
j'ai decidé de  faire un appel désésperé car ça fait 10 jours que je suis dans une impasse et je sens bien que je ne vais plus m'en tirer ...
ceci est la boucle recv() de laquelle je ne sort jamais ...
************************************************************
while(1) {
if(recv(sd,buff,1024,0)>0) {
printf(buff);
bzero(buff,1024);}
break;
}
**************************************************************
 
Le but est de pouvoir afficher la réponse du serveur et de pouvoir par la suite rentrer une nouvelle requete, et ceci indefinitivement ...
 
MERCI POUR TOUT AIDE
 

Reply

Marsh Posté le 17-03-2004 à 10:52:52   

Reply

Marsh Posté le 17-03-2004 à 17:31:03    

recv est bloquant, donc si il n'y a rien à lire sur ton socket il bloquera indefiniment.
Pour savoir si il y a qq chose à lire sur ton socket il faut que tu utilise select (ou poll)

Reply

Marsh Posté le 17-03-2004 à 19:02:16    

essebi_o a écrit :


Le but est de pouvoir afficher la réponse du serveur et de pouvoir par la suite rentrer une nouvelle requete, et ceci indefinitivement ...
 


 
 :ange:

Reply

Marsh Posté le 17-03-2004 à 19:08:32    

j'ai les files qui se touchent putain!

Reply

Marsh Posté le 17-03-2004 à 19:44:02    

Code :
  1. while(recv(sd,buff,1024,0)>0)
  2. {
  3.    printf(buff);
  4.    bzero(buff,1024);
  5. }


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 18-03-2004 à 12:26:59    

la methode de BlackGoddess je l'ai déjà essayé ... helas .. sans succes
Par contre quand tu parles de select, pospos, tu l'intègres dans une boucle while à la place de recv ?

Reply

Marsh Posté le 18-03-2004 à 13:46:09    

regarde le man de select
Select va te dire quels sockets sont actfis en lecture (ou en ecriture/exeption si tu lui a demandé).
 
donc l'idée c'est de renseigner le select avec le numero de ton socket dans la partie "read", puis lancer le select en attente jsuqu'a ce qu'il retourne. Cela voudra soit dire que le timeout est ecoulé (et dans ce cas tu peut rafraichir ton affichage ou tout autre chose, puis retourner dans le select), stoi que ton soket a qqchose à dire et donc dans ce cas tu peux faire ton recv.
 
En gros avant CHAQUE recv il faut que tu fasse un select pour savoir si il y a effectivement qq chose à lire, sinon recv va bloquer

Reply

Marsh Posté le 18-03-2004 à 13:48:54    

OK, un super MERCI pour l'explication !!
je vais faire ça ..

Reply

Marsh Posté le 29-03-2004 à 12:21:38    

UN ENORME MERCI A POSPOS
ça fonctionne à merveille avec select()
merci encore

Reply

Sujets relatifs:

Leave a Replay

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