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 :

send() bloque sans jamais sortir


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 75
    Par défaut send() bloque sans jamais sortir
    Bonjour,
    J'ai un code Cpp qui recoit un string d'une applet java, calcule un XML en fonction, et le renvoie a l'applet. Mais voila la fonction send() qui marchait dans le petit serveur de base qu e j'ai fait pour m'entrainer bloque littéralement maintenant, et fige l'applet au meme passage.

    MAXSIZE_XMLFILE = 5000000;

    alors j'ai vraiment pas pense que ca pouvait etre un probleme de taille de buffer. Alors je lui ai fait afficher son errno, Mais vu que send bloque, ca affiche jamais l'errno. Alors j'ai mis mon texte a la place du XML qui arrive. Et la surprise, j'ai l'erreur Broken pipe, erreur qui n'est pas repertorie dans la liste du manuel :

    http://www.linux-kheops.com/doc/man/...n2/send.2.html

    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
    int sendAnswerToSocket(string answerStr) {
      // answerStr = "<je t ai bien eu>\n";
      char buffer[MAXSIZE_XMLFILE];
      memset(buffer, '\0', sizeof(buffer));
      //http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/memset.3.html
      sprintf(buffer, answerStr.c_str());
      // sprintf(buffer,"et maintenant");
      //http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/sprintf.3.html
      cout<<"Answer from server: "<<buffer<<endl;
      //send(sock2, buffer, sizeof(buffer), 0);
     
      if(send(sock2, buffer, sizeof(buffer), MSG_DONTWAIT))//<=ICI EST LE PROBLEME
        cout<<"Error send() => "<<strerror(errno)<<endl;
      //http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/send.2.html
     
      //sendmsg(sock2, const struct msghdr *msg, MSG_DONTWAIT); 
     
      return 0;
    }

    Quelqu'un pourrais m'en dire un peu plus ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    - Allouer 5 Mo sur la pile c'est un peu bourrin
    - Pourquoi ne pas envoyer answerStr.c_str() directement au socket ?
    - send() renvoie un nombre négatif en cas d'erreur ; en cas de succès il renvoie le nombre d'octets envoyés
    - Tu as essayé en mode bloquant ?

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 75
    Par défaut
    Parce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int sendAnswerToSocket(string answerStr) {
     
      if(send(sock2, answerStr, sizeof(answerStr), MSG_DONTWAIT)) 
        cout<<"Error send() => "<<strerror(errno)<<endl;
     
     
      return 0;
    }
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MOTISSTUB_3.cpp: In function 'int sendAnswerToSocket(std::string)':
    MOTISSTUB_3.cpp:220: error: cannot convert 'std::string' to 'const void*' for argument '2' to 'ssize_t send(int, const void*, size_t, int)'
    et si je caste, je me fais remonter les bretelles aussi :
    invalid cast from type 'std::string' to type 'const void*'

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    send(sock2, answerStr.c_str(), answerStr.size(), MSG_DONTWAIT)

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/10/2009, 19h58
  2. Compte admin bloqué sans raison apparente
    Par threshold dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 18/09/2008, 09h35
  3. [Débutant] Réinitialiser une interface graphique sans en sortir
    Par Alucard9800XT dans le forum Interfaces Graphiques
    Réponses: 9
    Dernier message: 23/04/2007, 16h32
  4. Pc se bloque sans raisons
    Par madislak dans le forum Ordinateurs
    Réponses: 6
    Dernier message: 22/08/2006, 08h55

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