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

Boost C++ Discussion :

Boost Asio problème érratique


Sujet :

Boost C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut Boost Asio problème érratique
    Bonjour à tous,
    J'ai programmé une version très simple d'un client et d'un serveur. Cependant, le programme (testé en local) ne fonctionne pas la plupart du temps. A la suite le code posant problème.

    serveur.cpp :
    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
     
    #include <boost/asio.hpp>
    #include <iostream>
    #include <string>
    using namespace boost::asio;
     
    int main (void)
    {
      boost::asio::io_service ios;
      ::ip::tcp::acceptor ac(ios,::ip::tcp::endpoint(::ip::tcp::endpoint(ip::tcp::v4(), 4567)));
      ::ip::tcp::socket s(ios);
     
      ac.accept(s);
     
      std::string buf("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque diam eros, vestibulum at auctor ut, scelerisque eu diam. Vivamus congue sem tempus, bibendum magna vel, bibendum enim. Vivamus vehicula, nisi sed porttitor fermentum, nibh ante sollicitudin mi, vel iaculis lectus mauris et nibh. Donec sapien augue, fermentum et vestibulum ut, sollicitudin tincidunt tellus. Cras molestie sapien at leo vulputate scelerisque. Nam lacus velit, iaculis vitae condimentum vitae, iaculis vel velit. Nunc vehicula, ligula nec viverra dignissim, velit mi accumsan augue, a imperdiet volutpat.");
     
      size_t size = buf.length();
     
      s.send(::buffer(&s, sizeof(size_t)));
      s.send(::buffer(buf));
     
      return 0;
    }
    client.cpp :
    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
    24
    25
    26
    27
     
    #include <boost/asio.hpp>
    #include <iostream>
    using namespace boost::asio;
     
    int main (void)
    {
        ::io_service ios;
        ::ip::tcp::socket s(ios);
     
        s.connect(::ip::tcp::endpoint(::ip::address::from_string("127.0.0.1"), 4567));
     
        size_t size = 0;
     
        s.receive(::buffer(&size, sizeof(size_t)));
     
        std::cout << "size : " << size << std::endl;
     
        char buf[size + 1];
     
        s.receive(::buffer(buf, size));
     
        buf[size + 1] = '\0';
        std::cout << buf << std::endl;
     
        return 0;
    }
    Problèmes rencontrés :
    • la taille reçue est incorrecte ;
    • une fois "reçu" le buffer est vide.


    Ce que j'ai tenté :
    • remplacer s.send/s.receive par write et read ;
    • envoyer et recevoir le buffer par morceaux de petite taille.


    Merci par avance de votre aide sachant que ce code fonctionne de temps à autre et pardon si la solution est évidente.


    (PS : j'ai ce soucis dans un projet plus conséquent et je ne souhaite pas utiliser les fonctions asynchrones.)

    [edit1] Correction code client.
    [edit2] En testant ces deux programme par le réseaux, la taille reçue par le client est toujours la bonne, cependant le buffer reçu est désespérément vide...

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    Tu reçois un std::string dans un char [], c'est donc normal que cela ne fonctionne pas.
    Si tu envoies un std::string, il faut recevoir un std::string.
    Si tu reçois un char [], il faut envoyer un char []. http://www.cplusplus.com/reference/string/string/data/

    (PS: je n'utilise que les streams dans Boost.Asio)

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/07/2012, 12h03
  2. [boost::asio] Problème de connect
    Par Deneteth dans le forum Boost
    Réponses: 2
    Dernier message: 24/03/2009, 16h56
  3. Boost::Asio et code::blocks
    Par TocTocKiéLà? dans le forum Boost
    Réponses: 10
    Dernier message: 10/08/2007, 23h20
  4. Boost::asio et openssl
    Par Floréal dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 18/07/2007, 16h17
  5. Boost::asio : multi threading ou pas?
    Par Alp dans le forum Boost
    Réponses: 9
    Dernier message: 02/09/2006, 22h01

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