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

C++ Discussion :

Recv = 0 pour toujours :-/


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Par défaut Recv = 0 pour toujours :-/
    Salut tout le monde,

    Alors je suis confronté à un tout petit soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char* msg="bonjour";
    send(sock,msg,strlen(msg),0)
    char buffer[1024]; int tbuf;
    do
    {
    	tbuf=recv(sock,buffer,sizeof(buffer),0);
    	if (tbuf==SOCKET_ERROR) 
    	{
    		cout << "Erreur lors de la reception des donnes" << endl;
    		closesocket(sock);
    		break;
    	}	
    }while (tbuf>0);
    Jusqu'ici, tout se passe bien, ça quitte bien lorsque tbuf (valeur renvoyer par la fonction recv = 0)

    Le soucis, c'est que pour la suite de mon programme, j'envoie à nouveau un autre message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* msg2="ça va ?";
    send(sock,msg2,strlen(msg2),0)
    suivi du notre pour recevoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do
    {
    	tbuf=recv(sock,buffer,sizeof(buffer),0);
    	if (tbuf==SOCKET_ERROR) 
    	{
    		cout << "Erreur lors de la reception des donnes" << endl;
    		closesocket(sock);
    		break;
    	}	
    }while (tbuf>0);
    Seulement, il ne reçoit rien car tbuf = 0 et il ne change pas...

    La seul "solution" que j'ai pu trouver pour le moment, c'est de créé un autre socket pour recevoir à nouveau...
    Quelqu'un pourrait-il me proposer mieu ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Je ne suis que de passage mais je me demande si ta socket à un lecture blocante ou non ?

    Si la lecture est non blocante, alors, tant qu'il n'as rien recu recv retournera 0.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tandis qu'en lecture bloquante, recv() ne renverra 0 qu'après déconnexion, donc plus question de rappeler recv() ensuite, ça ne servira à rien...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut
    J,imagine que ton recv est blockant. Donc, il va blocker jusqu'à ce qu'il recoive quelque chose.

    recv() retourne le nombre de caractères reçu jusqu'à concurance de 1024 dans ton cas. Donc si ton recv() reçoit un message vide.. il retourne 0.

    Si non... comme là dis Higes... recv() retournera 0... mais je n'ai jamais utiliser de non-blockant, donc ^^'' la faute sur lui si c pas vrai!

  5. #5
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Citation Envoyé par Médinoc
    Tandis qu'en lecture bloquante, recv() ne renverra 0 qu'après déconnexion, donc plus question de rappeler recv() ensuite, ça ne servira à rien...
    Enlèves ta boucle do while.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Par défaut
    En faite, ce que j'ai effectuer (ne trouvant pas d'alternative) est de faire une fonction (du coup, ça créé une socket à chaque fois...)

    Ma fonction est bloquante toujours (et ma boucle do while) permet de maintenir la boucle jusqu'à que recv = 0.
    Ensuite, le second recv renvoie 0 octet ... :-/

    Si j'enlève ma boucle recv, alors on ne recevra qu'une partie des données..

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Par défaut
    Citation Envoyé par Higestromm
    Je ne suis que de passage mais je me demande si ta socket à un lecture blocante ou non ?

    Si la lecture est non blocante, alors, tant qu'il n'as rien recu recv retournera 0.
    Oui, c'est une socket à lecture blocante (en attente de recevoir qqchose pour le premier recv) et non blocante pour la suite.

    Il semblerai que je me suis mal exprimé car en faite, j'vais réexpliquer plus clairement :
    Voilà les étapes de mon programme :

    -> initialisation du socket
    -> connexion du socket
    -> envoie du premier message
    -> reception du message tant que tbuf>0
    -> envoie du second message
    -> reception du second message tant que tbuf>0

    Mon soucis est le suivant :
    Aucun soucis pour la reception du premier message.
    En revenche, j'envoie à nouveau un message et là, tbuf reste à 0 quoi qu'il arrive, donc, il ne receptionne rien..
    C'est à dire, tbuf= recv(..) me renvoie directement la valeur 0 au lieu des secondes données...

    Si vous avez besoin de précisions, n'hésitez pas

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut
    Fait ce petit test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int test;
     
    test = send(sock,msg2,strlen(msg2),0);
     
    cout << test << endl;
    bon pe que le on peux pas faire le cout dessus test.. je sais pas je code pas en console... mais dans le pire des cas regarde ce que test vaut à l'aide du debug. Est-ce qu'il égal 0? pe que oui ^^ sinon... bah, dsl je débute en socket... fait 1 semaine loll

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Par défaut
    Citation Envoyé par Dathamir
    bon pe que le on peux pas faire le cout dessus test.. je sais pas je code pas en console... mais dans le pire des cas regarde ce que test vaut à l'aide du debug. Est-ce qu'il égal 0? pe que oui ^^ sinon... bah, dsl je débute en socket... fait 1 semaine loll
    Oui, oui, j'ai déjà effectuer ce test avant de poster et le résultat est égal à 0.

    C'est pourquoi le titre de mon topic est bien qu'une fois que tbuf est à 0, il le reste...

    Or, normalement, si on suit la logique qu'un socket est un "tube" où on peut envoyer et recevoir ... je ne pensait pas que c'était qu'une seul fois...
    Normalement, sur ce tube, on peut communiquer plusieurs fois (envoyer, recevoir, re-envoyer et recevoir à nouveau) nan ?

  10. #10
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Citation Envoyé par RepliCarter
    Oui, oui, j'ai déjà effectuer ce test avant de poster et le résultat est égal à 0.

    C'est pourquoi le titre de mon topic est bien qu'une fois que tbuf est à 0, il le reste...

    Or, normalement, si on suit la logique qu'un socket est un "tube" où on peut envoyer et recevoir ... je ne pensait pas que c'était qu'une seul fois...
    Normalement, sur ce tube, on peut communiquer plusieurs fois (envoyer, recevoir, re-envoyer et recevoir à nouveau) nan ?
    Le tube créer fonctionne comme tous les autre, une fois créer tu l'utilise autant que tu veux seulement le tube, c'est bien le socket et pas la fonction recv().

    J'ai déja développer un client / serveur, et je n'ai jamais rencontrer ton probleme... Par contre comment tu fait pour avoir un socket en lecture blocante dans un premier temps et ensuite de l'avoir en non blocant ?

    Peux tu nous donner un peu de code ?

Discussions similaires

  1. Ébauche pour toujours ?
    Par stendhal666 dans le forum Blogs du Club
    Réponses: 8
    Dernier message: 30/01/2019, 09h38
  2. rendre inactif bouton pour "toujours"
    Par 8e8eClo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/12/2011, 11h42
  3. Réponses: 2
    Dernier message: 03/10/2009, 11h33
  4. [SOCKET C] deux send() pour un recv()
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 01/12/2003, 19h13

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