2010-01-22 7 views
2

Je suis assez nouveau pour booster. J'avais besoin d'une API de réseau C++ bas niveau multiplateforme, donc j'ai choisi asio. Maintenant, j'ai réussi à me connecter et à écrire sur un socket, mais comme j'utilise la lecture/écriture asynchrone, j'ai besoin d'un moyen de garder une trace des requêtes (pour avoir une sorte d'identifiant, si vous voulez). J'ai regardé la documentation/référence, et je n'ai trouvé aucun moyen de transmettre des données utilisateur à mon gestionnaire, la seule option à laquelle je pense est de créer une classe spéciale qui fait office de rappel et garde la trace de son identifiant, puis le passe à la socket en tant que rappel. Y a-t-il un meilleur moyen? Ou est le meilleur moyen de le faire?Écrire asynchrone aux valeurs socket et utilisateur (question boost :: asio)

Répondre

3

Les fonctions async_xxx sont modélisées sur le type du gestionnaire d'achèvement. Le gestionnaire ne doit pas nécessairement être un "callback" simple, et peut être tout ce qui expose la bonne signature operator().

Vous devriez donc être en mesure de faire quelque chose comme ceci:

// Warning: Not tested 
struct MyReadHandler 
{ 
    MyReadHandler(Whatever ContextInformation) : m_Context(ContextInformation){} 

    void 
    operator()(const boost::system::error_code& error, std::size_t bytes_transferred) 
    { 
     // Use m_Context 
     // ...    
    } 

    Whatever m_Context; 
}; 

boost::asio::async_read(socket, buffer, MyReadHander(the_context)); 

Sinon, vous pouvez aussi avoir votre gestionnaire en fonction simple et la lier au site d'appel, comme décrit dans le asio tutorial. L'exemple ci-dessus serait alors:

void 
HandleRead(
    const boost::system::error_code& error, 
    std::size_t bytes_transferred 
    Whatever context 
) 
{ 
    //... 
} 

boost::asio::async_read(socket, buffer, boost::bind(&HandleRead, 
    boost::asio::placeholders::error_code, 
    boost::asio::placeholders::bytes_transferred, 
    the_context 
)); 
+0

Merci! Cela a fonctionné parfaitement. – fingerprint211b

Questions connexes