Comment détecter le moment où un coup de pouce socket tcp déconnecte
Supposons que j'ai un culot:
std::shared_ptr<tcp::socket> socket( new tcp::socket(acceptor.get_io_service()) );
acceptor.async_accept( *socket, std::bind( handleAccept, this, std::placeholders::_1, socket, std::ref(acceptor)) );
Et je stocker un weak à ladite prise dans un récipient. J'ai besoin de cela parce que je veux autoriser les clients à la demande pour une liste d'autres clients, afin qu'ils puissent envoyer des messages les uns aux autres.
clients_.insert(socket); //pseudocode
Puis-je exécuter certaines opérations asynchrones
socket->async_receive( boost::asio::buffer(&(*header), sizeof(Header))
, 0
, std::bind(handleReceiveHeader, this, std::placeholders::_1, std::placeholders::_2, header, socket));
Comment puis-je détecter lorsque la connexion est fermée, donc je peux supprimer mon socket du conteneur?
clients_.erase(socket); //pseudocode
OriginalL'auteur aCuria | 2013-11-10
Vous devez vous connecter pour publier un commentaire.
Un socket TCP débranchez est généralement signalé dans
asio
par uneof
ou unconnection_reset
. E. g.- Je utiliser
boost::signals2
de signal de déconnexion bien que vous pouvez toujours passer un pointeur à une fonction de votre classe socket et puis appelez.Être prudent au sujet de votre support et de rappel de la durée de vie, voir: boost-async-fonctions-et-partagé-ptrs
J'ai trouvé que cela fonctionne vraiment, j'ai l'erreur "connection_reset". Cependant, dans la documentation, j'ai remarqué un autre code d'erreur, "connection_aborted". Est-il nécessaire pour gérer ce code d'erreur?
C'est un lien utile @aCuria. Une autre source d'erreur des codes est le fichier
boost/system/error_code.hpp
. Comme pour le "connection_aborted" erreur, je n'ai pas vu cela dans mes applications, mais il n'y a pas de mal à tester pour elle aussi.Cool. Mais que faire si vous ne voulez pas recevoir de données? La seule chose que je veux savoir, c'est si la connexion est en haut ou en bas, sans même essayer de lire quelque chose de côté distant envoie. Regarde comme il n'existe pas d'API en asio.
votre exigence semble tout à fait inhabituel. C'est un protocole de communication, donc de l'envoi et de la réception des données est c'est la raison d'être...
OriginalL'auteur kenba
Il existe de nombreuses options, certains d'entre eux sont:
Que vous stockez
weak_ptr
en conteneur - il ne prolongera pas la durée de vie du support, de sorte que lorsque votre gestionnaire d'obtenirboost::asio::error::eof
(ou autre), il ne va pas faire de copier/déplacer desshared_ptr
, et socket sera supprimé (si vous n'avez pas d'autresshared_ptr
s). Ainsi, vous pouvez faire quelque chose comme:if(socket.expired()) clients_.erase(socket);
Vérifier le code d'erreur dans votre gestionnaire d' - il indiquer si la connexion est fermée. À l'aide de cette info, vous pouvez appeler
clients_.erase
de gestionnaire lui-même.Il sera quelque chose comme:
Ajout de l'exemple.
Je ne pense pas que je devrais effacer sur une erreur, une rapide recherche sur google ne semble pas jeter une liste de codes d'erreur spécifiquement pour async_receive.
Erreur associée à une connexion fermée: boost::asio::erreur::eof, erreur associée à une réinitialisation de la connexion: boost::asio::erreur::connection_reset
OriginalL'auteur Evgeny Panasyuk