IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

recv() et nombre d'octets lus...


Sujet :

Réseau C

  1. #1
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    Par défaut recv() et nombre d'octets lus...
    Bonjour tout le monde !

    J'ai un petit probleme qui me pose bien des problemes...

    Je developpe une application reseau, qui marche tres bien sauf par moment : mon client envoie bien toute les donnees (des messages compose d'une code (short) et d'une chaine)...

    Dans ma fonction de reception (cote serveur), je fais alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    	if((nbread=read(desc, &(msg->code), sizeof(short))) == -1)
    		reterr("cannot read the message's code", ESYS, -1)
    	else if(nbread != sizeof(short))
    	{
    		log_err(func, "cannot read the code at once (nbread=%d)", CEINTER, nbread);
    		return -1;
    	}
    ...
    Le probleme, c'est que parfois je passe dans le cas (nbread != sizeof(short)) i.e. nbread==1... ce qui me peine beaucoup, sachant q'un short fait 2 octets. (le client a cependant bien envoye toutes les donnees).

    La fonction recv() n'est-elle pas supposee attendre que toutes les donnes sont presentes ? (sachant qu'elle est en mode bloquant, par defaut non ?).... ou alors c'est un autre probleme reseau qui intervient ?
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Mon man dit plutot qu'elle renvoie toutes les données recus, et au maximum troisieme argument donnée. Ci dessous l'extrait exacte du man plutot que ma traduc foireuse.

    The receive calls normally return any data available, up to
    the requested amount, rather than waiting for receipt of the full amount
    requested
    Pour ton probleme apres je sais pas trop d'ou ca peut venir. faudrait sniffer les différentes données que tu recois pour voir ce que tu recuperere exactement.

    PS ton code utilise read, pas recv . Mais recv c mieux pour la portabilité.

    ZUL

  3. #3
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    Par défaut
    Bon, deja : merci pour ta reponse.

    Ensuite : autant pour moi, j'avais remplace mes recv() par des read() pour tester... mais c'est pareil... je suis repasse a recv() et ca ne marche toujours pas....

    J'ai compare quelque man,
    Celle d'un SunOS 5.8 dis ceci :
    ...
    If no messages are available at the socket, the receive call
    waits for a message to arrive, unless the socket is non-
    blocking (see fcntl(2)) in which case -1 is returned with
    the external variable errno set to EWOULDBLOCK.
    ...
    rien ne dis qu'elle retourne si il n'y a pas assez de donnees...

    Par contre, la man d'une Madrake 8 dit :
    ...
    Les fonctions de réception renvoient nor-
    malement les données disponibles sans attendre d'avoir reçu le nombre
    exact réclamé.
    ...
    Donc la, pas de toute, recv() n'attend pas ! (moi en fait je pensais qu'elle retournais moins de donnees que prevues SEULEMENT si elle revoit un signal de fin de transmission, genre un EOF )

    Bref... Dans le cas d'un tableau de char, ya pas de pb... tant que j'ai pas lu le tout, je refais des tentatives... mais dans le cas d'un short ou d'un long, c'est moins sur.... yora pas des pb de portabilite (bits de poids fort et faibles inverses) ?
    PS : si je fais circuler des nombre sur le reseau, je les met d'abord au format reseau.

    Bon... je fais tester une fonction safe_recv() qui devra attendre toutes les donnes....
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 26
    Points
    26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    else if(nbread != sizeof(short))
    Pour moi sizeof(short)) est toujours égal à 2 en conséquence des que tu reçois un nombre de caractères != de 2 tu passes dans cette condition.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    Par défaut
    > gc243

    Bein c'etait un peu le but du test :

    Si pas erreur
    Et Si bonne taille
    Alors
    je continue
    ...
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

  6. #6
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    Par défaut
    C'est bon... j'ai fait une fonction full_recv() qui fait ce que je croyait que recv() fesait....

    Si ca interesse quelqu'un, la voila :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    int full_recv(int s, void *buf, size_t len, int flags)
    {
    	char* func="full_recv";
    	int nbread, offset;
     
     
    	offset=nbread=0;
    	while((len-offset) > BUFSIZ)
    	{
    		if((nbread=recv(s, ((char*)buf)+offset, BUFSIZ, flags)) == -1)
    			reterr("cannot receive full data (1)", ESYS, -1);
    		offset+=nbread;
    	}
    	while(offset < len)
    	{
    		if((nbread = recv(s, ((char*)buf)+offset, (len-offset), flags)) == -1)
    			reterr("cannot receive full data (2)", ESYS, -1);
    		offset+=nbread;
    	}
     
    	return offset;
    }
    @bientot alors !
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connaitre le nombre d'octets lus
    Par totoche dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 11/09/2008, 15h53
  2. Compter le nombre d'octets ecrits sur une socket
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 19/07/2007, 22h29
  3. nombre d'octet chaine unicode
    Par -=zol=- dans le forum Visual C++
    Réponses: 5
    Dernier message: 20/04/2007, 09h54
  4. Réponses: 3
    Dernier message: 27/02/2007, 20h35
  5. Compter le nombre d'octets lus dans un flux
    Par Le Furet dans le forum Entrée/Sortie
    Réponses: 25
    Dernier message: 09/03/2006, 08h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo