Fonction recv

Résolu
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008 - 15 déc. 2007 à 21:11
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 - 17 déc. 2007 à 15:25
bonjour,





int recv(int
s
, void *
buf
, int
len
, unsigned int
flags
);


#define MAX  10

int tampon[MAX];

lu = recv( socket , tampon , MAX, 0);

tampon[lu] = '\0';

Je fais de la programmation réseau  et je voudrais savoir si  il y a un moyen de faire varier la taille de son tampon afin d'afficher

tout le contenu du tampon en plusieur fois ou une seule fois.

Il faudrait que j'arrive à  afficher à la suite tout le message.

printf("%s",tampon);

cordialement,

14 réponses

sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
17 déc. 2007 à 15:20
J'ai trouvé la soluce Merci
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
15 déc. 2007 à 21:31
Ben normalement on fait une boucle qui ne quitte que si le nombre d'octets lus est nul (ou plus petit dans le cas de SOCKET_ERROR).
Ça devrait donc donner quelque chose comme:

while(recv(socket, tampon, (MAX-1), 0) > 0) {
    printf("%s", tampon);
}

Sinon, oui on peut faire "varier" la taille d'un buffer mais seulement avec une allocation dynamique. En fais, on ne fait rien varier. On ne fait qu'allouer une plage mémoire plus grande. De plus, il faudra recopier toute les données de l'ancien buffer vers le nouveau et plus le buffer est gros, plus ça prendra de temps. Grosse perte de performance en perspective.

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
15 déc. 2007 à 21:33
Oups:

int lu;

while((lu = recv(socket, tampon, (MAX-1), 0)) > 0) {
    tampon[lu] = 0;
    printf("%s", tampon);
}

C++ (@++)<!--
0
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
15 déc. 2007 à 22:40
J'implémente un client pop

l'ennui c'est que sa ne sort pas de la boucle
while((lu = recv(socket, tampon, (MAX-1), 0)) > 0) {
    tampon[lu] = 0;
    printf("%s", tampon);
}

à l'affichage j'ai ::
+OK hello from popgate on pop009.mail.ukl.yahoo.com 2.38.1
puis plus rien

alors que le code qui suit cette boucle est ::

sprintf(tampon,"USER %s\r\n ",identifiant);
printf("%s",tampon);
    send(s,tampon,strlen(tampon),0);
    lu = recv(s,tampon,MAX,0);
    tampon[lu] = '\0';
    printf("%s",tampon);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
15 déc. 2007 à 22:42
je devrais recevoir un +OK password required.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
16 déc. 2007 à 00:46
send(s,tampon,strlen(tampon),0);


lu = recv(s,tampon,MAX,0);

tampon[lu] = '\0';
printf("%s",tampon);

Tu envois et recois sur le même socket ?

C++ (@++)<!--
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
16 déc. 2007 à 09:51
Salut,

Les commandes et les réponses sont terminées par \r\n ou \n, c'est
lorsque cette sequence est reconnue que tu dois sortir de ta boucle.

Donc par exemple, la démarche a suivre:

- tu rajoutes dans un (gros) buffer tout ce que tu recois

- a chaque fois que tu rajoutes quelques chose dans ton buffer, tu verifie si il n'y a pas un \n dedant

- si tu trouves un \n, tu as une réponse complete et donc tu peux l'extraire et l'afficher.
0
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
16 déc. 2007 à 10:03
Oui c'est la meme socket s.

while((lu = recv( s , tampon, (MAX-1), 0)) > 0) {
    tampon[lu] = '\0';
    printf("%s", tampon);
}

sprintf(tampon,"USER %s\r\n ",identifiant);
printf("%s",tampon);
    send(s,tampon,strlen(tampon),0);
    lu = recv( s ,tampon,MAX,0);
    tampon[lu] = '\0';
    printf("%s",tampon);
0
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
16 déc. 2007 à 13:22
Le petit soucis c'est que des que je met recv dans une boucle cela ne sort plus de la boucle

exemple  code 1:
    /* reception des donnees */
    while((lu = recv(s,tampon,MAXLIGNE,0))> 0){ /* bloquant*/
    tampon[lu] = '\0';
    printf("%s",tampon);
    }
 
         
      sprintf(tampon,"USER %s\r\n",identifiant);
      send(s,tampon,strlen(tampon),0);
      lu = recv(s,tampon,MAXLIGNE,0);
      tampon[lu] = '\0';
      printf("%s",tampon);

execution:
desktop:~$ ./monpop  pop.mail.yahoo.fr identifiant
+OK hello from popgate on pop010.mail.ukl.yahoo.com 2.38.1
<hr size="2" width="100%" />exemple  code   2:

    /* reception des donnees               1*/
    lu = recv(s,tampon,MAXLIGNE,0); /* bloquant*/
    tampon[lu] = '\0';
    printf("%s",tampon);
   
 
              /* reception des donnees      2 */
    lu = recv(s,tampon,MAXLIGNE,0); /* bloquant*/
    tampon[lu] = '\0';
    printf("%s",tampon);

            /* reception des donnees     3*/
    lu = recv(s,tampon,MAXLIGNE,0); /* bloquant*/
    tampon[lu] = '\0';
    printf("%s",tampon);

      sprintf(tampon,"USER %s\r\n",identifiant);
      send(s,tampon,strlen(tampon),0);
      lu = recv(s,tampon,MAXLIGNE,0);
      tampon[lu] = '\0';
      printf("%s",tampon);
execution:
desktop:~$ ./monpop  pop.mail.yahoo.fr identifiant

+OK hello from popgate on pop010.mail.ukl.yahoo.com 2.38.
+OK password require
<hr size ="2" width="100%" />
La je fais 3 recv mais je remarque que si j'en fais plus cela se comporte comme dans la premiere exécution
execution:
desktop:~$ ./monpop  pop.mail.yahoo.fr identifiant

+OK hello from popgate on pop010.mail.ukl.yahoo.com 2.38.1

Mais où est  passé le +OK password require ??
0
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
16 déc. 2007 à 14:07
recv est bloquant, donc si il n'y a rien à lire sur ton socket il bloquera indefiniment.
0
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
16 déc. 2007 à 14:07
lol je me repond à moi même
0
sy3ns Messages postés 80 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 16 avril 2008
16 déc. 2007 à 14:14
Que faire ?
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
16 déc. 2007 à 15:07
do
{
    recv(...)
} while (condition de sortie)

Dans la condition de sortie, tu regardes si tu as reçu une chaine avec \r\n. (je crois avoir lu que les chaines pop3 se terminent de la sorte)
Tu répetes ça autant de fois que tu en as besoin.

AGILiCOMSavon
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
17 déc. 2007 à 15:25
Si tu pouvais la poster pour les futures recherches....

AGILiCOMSavon
0
Rejoignez-nous