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() ne sait plus s'arreter


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut recv() ne sait plus s'arreter
    Bonjour,
    dans le cadre d'un echange client/serveur par socket, j'utilise recv() pour recevoir des données transmisent par send(). Si a la fin de mon send() je ferme la socket en écriture, pas de probleme, recv() detecte bien la fin d'envoi et le programme passe a la suite. Mais je ne souhaite pas fermer ma socket en ecriture juste après l'envoi, et recv() ne detecte pas de fin d'envoi ... il boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while((rd = recv(sock, buffer, sizeof(buffer),0)) > 0)
    {	
    	write(dest, buffer, rd);
    	taille += rd;
    }
    Comment resoudre le probleme ?


    Merci d'avance

  2. #2
    Membre actif Avatar de peijnoob
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 279
    Points : 294
    Points
    294
    Par défaut
    Vous pouvez, je pense, envoyer un tag en fin d'envoi qui définit que celui ci est terminé.

    Vous pouvez donc sortir de la boucle sans fermer la socket.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    j'y ait pensé !
    mais c'est de l'envoi de données de tout type, quel tag pourrait nappartenir a aucun fichier ?
    On ne peut pas réouvrir une socket en écriture ?

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par CouaC
    Mais je ne souhaite pas fermer ma socket en ecriture juste après l'envoi, et recv() ne detecte pas de fin d'envoi ... il boucle.
    Bizarre. Normalement, recv() est bloquant. Tu n'aurais pas modifié ça ?
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Non pas de modification de ce coté la, le truc bizarre c'est que seul cette boucle est defaillante ... avant j'utilise recv() et il fonctionne comme il faut (phase de synchro) mais là où il envoie des données impossible de le stopper a part fermer la socket en écriture.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par CouaC
    Non pas de modification de ce coté la, le truc bizarre c'est que seul cette boucle est defaillante ... avant j'utilise recv() et il fonctionne comme il faut (phase de synchro) mais là où il envoie des données impossible de le stopper a part fermer la socket en écriture.
    Quelle est la valeur retournée par recv() quand il boucle ?
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Une valeur strictement positive parce qu'en testant la valeur pour nul ou inferieure a 0, ça ne break; pas ...

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par CouaC
    Une valeur strictement positive parce qu'en testant la valeur pour nul ou inferieure a 0, ça ne break; pas ...
    Quel est le type de rd ?
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    rd est un int. il correspond au nombre d'octets lu par recv dans la socket
    (je pense que tu le sais mais sinon le message serait trop vide ^^)

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par CouaC
    rd est un int.
    OK. Alors je ne vois plus qu'une cause possible : l'émission ne s'arrête pas !

    Montre ton code.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    J'y ai pensé aussi :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while((read = fread(buffer, 1, SIZE, f)) > 0)
    {
    	send(sock, buffer, read, 0);
    	memset(buffer,0, SIZE);
    	taille += read;
    }
     
    printf("Apres fread()\n");
    Je lis un fichier que j'envoie dans la socket , le printf est bien executé, donc l'envoie s'arrete bien... Je ne comprend plus rien là :s

  12. #12
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    Tu peux tester avec la taille du fichier(while(envoyé!=taille-fichier))et donc le send() sera au milieu de la boucle.

  13. #13
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Par expérience je sais que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((rd = recv(sock, buffer, sizeof(buffer),0)) > 0)
    Est très mal toléré, essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rd = recv(sock, buffer, sizeof(buffer),0);
    while( rd > 0)
    Ca devrait marcher.

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par juve1897
    Par expérience je sais que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((rd = recv(sock, buffer, sizeof(buffer),0)) > 0)
    Est très mal toléré,
    Par qui ? Par quoi ? Pourquoi ?
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rd = recv(sock, buffer, sizeof(buffer),0);
    while( rd > 0)
    Ca devrait marcher.
    Je ne pense pas...
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    ça marche mais pas mieux ... je comprend plus là :s
    on peut pas réouvrir une socket fermée en ecriture ? ou simuler la fermeture en envoyant un signal quelconque ?

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bon alors de bonnes nouvelles ! recv() retourne 0 si et seulement si la socket est fermée en écriture a l'autre bout ! Donc il faut préalablement soit redefinir un protocole qui encapsule la taille des données ce qui permet ensuite de lire seulement la taille du paquet ou soit on envoie la taille du fichier avant et on lit tant que la taille reçue est differente de la taille envoyée

    Merci de votre aide en tout cas

  17. #17
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    bah t'as plus simple.. Tu changes l'état du socket en le mettant en lecture.... côté écriture.... du coup le côté lecture aura 0 ...

    Non ?

    je sais pas, ce que j'en dis moi...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Hum possible, mais j'ai besoin de conserver les états, parce qu'après transmission des données il y a encore une phase d'échange de messages.

  19. #19
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Bon de toutes façons c'est toujours mieux de faire comme ça :

    Citation Envoyé par CouaC
    soit on envoie la taille du fichier avant et on lit tant que la taille reçue est differente de la taille envoyée
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. Problème, mon ordinateur ne sait plus compter
    Par Coco4486 dans le forum C++
    Réponses: 3
    Dernier message: 10/05/2008, 15h51
  2. Windows ne sait plus compter
    Par Nasky dans le forum Windows XP
    Réponses: 4
    Dernier message: 10/09/2006, 01h29
  3. Réponses: 1
    Dernier message: 23/01/2006, 12h56
  4. Problème de boot , ne sait plus quoi faire ...
    Par timZeR0 dans le forum Administration système
    Réponses: 3
    Dernier message: 02/12/2005, 18h01
  5. Réponses: 2
    Dernier message: 29/07/2005, 10h14

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