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)
2
A
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
));
Questions connexes
- 1. boost :: propriété asio et socket
- 2. boost :: asio, erreur de lecture asynchrone
- 3. boost asio: 0 octet écrire
- 4. Faire un client asynchrone avec boost :: asio
- 5. boost asio ssl flux socket compilation problème
- 6. Boost Asio et Web Sockets?
- 7. boost :: appels serveur asio et récursifs
- 8. Boost ASIO async_accept compilation échoue
- 9. Comment obtenir l'adresse IP de boost :: asio :: ip :: tcp :: socket?
- 10. boost :: asio :: ip :: tcp :: le socket est connecté?
- 11. Boost asio udp waitForReadyRead
- 12. boost asio deadline_timer
- 13. Qui utilise Boost ASIO?
- 14. Envoyer des données avec boost :: asio :: socket_base
- 15. boost asio prenant 100% cpu à lire
- 16. Boost :: prises asio - comment les déconnecter proprement?
- 17. boost :: asio: threads événements asynchrones locaux
- 18. Fragmentation de la mémoire @ boost :: asio?
- 19. Ressource temporairement indisponible dans Boost ASIO
- 20. boost :: handshake asio via un proxy http?
- 21. Comment construire boost :: exemple asio?
- 22. Mieux boost asio deadline_timer exemple
- 23. Boost Asio gestionnaire de async_wait
- 24. Adresse déjà utilisée avec boost asio acceptor
- 25. pouvez-vous définir les options de socket SO_RCVTIMEO et SO_SNDTIMEO dans boost asio?
- 26. Interruption boost :: asio lecture synchrone?
- 27. boost :: asio tcp async_read ne retourne jamais
- 28. boost :: asio async_accept Refuser une connexion
- 29. Utiliser boost :: asio :: async_read avec stdin?
- 30. Socket asynchrone, déconnexion forcée et réutilisation
Merci! Cela a fonctionné parfaitement. – fingerprint211b