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 :

fin d'un receive non bloquant


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 45
    Par défaut fin d'un receive non bloquant
    Bonjour à tous,

    J'utilise actuellement la fonction recv() en mode non bloquant.
    Je voulais savoir comment je pourrais savoir que le recv est terminé, c'est-à-dire qu'on ne recevra plus aucune données? (sachant que je ne connais PAS la taille totale des données que je dois recevoir au total).

    Bien sur, je ne veux pas être obligé d'attendre la fin d'un timer, si la fonction ne recevra plus rien, j'aimerais le savoir et continuer le programme sans erreur.

    En gros si la fonction me retourne à un moment 0, je voudrais savoir si c'est juste ce tour-ci que je n'ai rien reçu ou si c'est juste qu'il n'y a plus rien à recevoir.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Hello,

    Tu utilises quel protocole ?

    Par définition, recv() renvoie zéro lorsque l'homologue a effectué un arrêt normal. Bien sûr, c'est en faisant l'hypothèse que ton correspondant referme la transmission quand il a fini d'émettre. Sinon, le système ne peut pas savoir s'il a réellement fini. Si tu te retrouves dans ce cas, il faut que tu rédiges ton propre protocole et que tu définisse un signal pour indiquer cette fin de transmission.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 45
    Par défaut
    Bonjour et merci de ta réponse.

    J'utilise le protocole TCP.

    Dans le cas d'un recv() non bloquant, le 0 retourné peut simplement vouloir dire que je n'ai pas reçu de données ce tour si. Peut-être que le recv() suivant j'en recevrais.

    Comment savoir si le 0 veut dire "dommage essaye encore" ou "il n'y a plus rien a recevoir" sans connaitre la taille total? Existe-t-il une fonction autre que le receive permettant de savoir si le serveur à fermé la transition?

    J'ai l'impression de m'embrouiller pour rien.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par Darkantho Voir le message
    Comment savoir si le 0 veut dire "dommage essaye encore" ou "il n'y a plus rien a recevoir" sans connaitre la taille total? Existe-t-il une fonction autre que le receive permettant de savoir si le serveur à fermé la transition?
    Eh bien, parce qu'il y a un code d'erreur qui signifie exactement ce que tu viens de dire : EAGAIN, pour « Ressource temporary unavailable, try again later ».

    Si ton socket n'est pas en mode bloquant, le fait de ne pas pouvoir lire (parce qu'il n'y a rien à lire) va se traduire par une erreur. Tu obtiendras donc -1 et pas zéro, et errno prendra cette valeur.

    Extrait de la man page concernée :

    Si aucun message n'est disponible sur la socket, les fonctions de réception se mettent en attente, à moins que la socket soit non bloquante (voir fcntl(2)) auquel cas la valeur -1 est renvoyée, et errno est positionnée à EAGAIN ou EWOULDBLOCK. Les fonctions de réception renvoient normalement les données disponibles sans attendre d'avoir reçu le nombre exact réclamé.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Autre solution : tu envoies toi-même un message (je sais pas, moi "ENDTRANSMISSION" par exemple)qui dit que c'est fini..

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Autre solution : tu envoies toi-même un message (je sais pas, moi "ENDTRANSMISSION" par exemple)qui dit que c'est fini..
    (C'est ce que je lui suggère dans mon post #2 )

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    sorry.. j'avais zappé

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/10/2005, 12h29
  2. Réponses: 5
    Dernier message: 02/09/2005, 12h47
  3. Rendre la lecture non bloquante
    Par Charlinecha dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 05/07/2005, 15h46
  4. Réponses: 3
    Dernier message: 16/03/2004, 16h42
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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