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 lecture asynchrone


Sujet :

Boost C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Boost::asio lecture asynchrone
    Bonjour à tous,

    Je fais appel à vous car j'ai un problème que j'ai passé la journée à essayer de résoudre...

    En fait j'ai une classe HttpClient qui permet d'envoyer des requêtes HTTP et de récupérer la réponse. Mon problème est que j'utilisais jusqu'à présent la méthode read_until mais je me suis vite heurté au fait que si le serveur ne répondait pas à la requête alors la fonction restait bloqué et le programme ne se quittait jamais.

    J'ai donc voulu utilisé la méthode async_read_until ceci afin d'implémenter un système de timeout. Le handler de réception était une méthode de la classe HttpClient. J'ai donc essayé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::cout << "Before call" << std::endl;
    boost::asio::async_read_until(socket, response_streambuf, "\r\n\r\n",
                                      boost::bind(&HttpClient::Header_receive_handler, this, _1, _2));
    std::cout << "After call" << std::endl;
    Et le handler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void HttpClient::Header_receive_handler(const boost::system::error_code & error, std::size_t bytes_transferred)
    {
        std::cout << "Start receive handler for ip address " << this->ipAddress << std::endl;
     
        if (!error)
        {
            ...
        }
     
    }
    Le problème est que la méthode Header_receive_handler n'est jamais appelée (pas de message Start receive handler...)

    Si une âme charitable pouvait m'éclairer

    Merci d'avance,

    Yann.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu fais tourner ton io_service ?
    Boost ftw

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Non effectivement c'était à cause de ça !

    J'ai changé le code en ceci pour la gestion de timeout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
        boost::asio::async_read_until(socket, response_streambuf, "\r\n\r\n",
                boost::bind(&HttpClient::Header_receive_handler, this,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred)
                );
     
        timer.expires_from_now(boost::posix_time::seconds(HTTP_TIMEOUT_VALUE));
        timer.async_wait(boost::bind(&HttpClient::Timeout_handler, this,
                boost::asio::placeholders::error));
     
        io_service.run();
    Ca fonctionne à peu près, il me reste quelques petits soucis à régler mais je suis maintenant débloqué. Merci encore pour ton aide

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

Discussions similaires

  1. Meilleure façon d'utiliser un serveur asynchrone (Boost.Asio)
    Par Masmeta dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 17/12/2014, 09h59
  2. Boost::asio et openssl
    Par Floréal dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 18/07/2007, 16h17
  3. Lecture Asynchrone STDOUT & STDERR
    Par ecatum dans le forum Langage
    Réponses: 3
    Dernier message: 04/04/2007, 17h50
  4. [WIN32][TComport] Lecture Asynchrone
    Par Linkin dans le forum Delphi
    Réponses: 5
    Dernier message: 30/03/2007, 10h49
  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