J'utilise des sockets asynchrones boost pour mon application serveur. J'ai créé une fonction disconnect() qui appelle la méthode close de boost(), puis supprime la socket (suppression de l'opérateur). Et ça va quand la fonction est appelée par l'un des asynchrones. les gestionnaires, mais quand je l'appelle de l'intérieur de ma base de code principale, l'ensemble de l'application se bloque à l'un des gestionnaires asynchrones. Comment bien fermer une socket en boost?Boost :: prises asio - comment les déconnecter proprement?
Répondre
Assurez-vous que que l'objet est en vie tant que les gestionnaires qui peuvent l'utiliser existent.
Il est probable que l'un des gestionnaires qui utilise cette prise est appelée après que vous appelez à proximité (comme signale l'erreur au gestionnaire) et accède alors à pointer mort ...
Habituellement, la manipulation de la durée de vie peut être facilement fait avec boost::shared_ptr
et boost::enable_shared_from_this
et en le passant dans les gestionnaires. Voir de nombreux exemples fournis avec Boost.Asio. Une fois que vous vous serez familiarisé avec cette technique, la question que vous poserez vous semblera insignifiante.
Vous souhaitez également examiner la méthode d'arrêt sur un socket. Cela ne résoudra pas votre problème d'application. Artyom ci-dessus a déjà expliqué la cause de cela, mais il est néanmoins intéressant. Si vous fermez un socket sans appeler l'arrêt, il se peut qu'un RST soit envoyé au lieu d'un établissement de liaison FIN.
sûrement, il en résulte seulement une RST si vous éteignez explicitement s'attarder ... –
- 1. Comment construire boost :: exemple asio?
- 2. Boost asio udp waitForReadyRead
- 3. boost asio deadline_timer
- 4. Qui utilise Boost ASIO?
- 5. Boost Asio gestionnaire de async_wait
- 6. Interruption boost :: asio lecture synchrone?
- 7. Mieux boost asio deadline_timer exemple
- 8. boost :: propriété asio et socket
- 9. boost asio: 0 octet écrire
- 10. Boost ASIO async_accept compilation échoue
- 11. Boost Asio et Web Sockets?
- 12. Comment se connecter/se déconnecter d'un serveur?
- 13. boost :: asio: Comment utiliser async_accept pour accepter les connexions entrantes?
- 14. Fragmentation de la mémoire @ boost :: asio?
- 15. Est-il plus efficace d'utiliser boost :: asio :: basic_stream_socket :: async_read_some au lieu de boost :: asio :: async_read?
- 16. boost :: asio: threads événements asynchrones locaux
- 17. boost :: asio async_accept Refuser une connexion
- 18. Boost asio ip tcp iostream Détection d'erreur
- 19. Utiliser boost :: asio :: async_read avec stdin?
- 20. boost :: appels serveur asio et récursifs
- 21. Adresse déjà utilisée avec boost asio acceptor
- 22. Envoyer des données avec boost :: asio :: socket_base
- 23. C++ Boost Minuterie périodique simple ASIO?
- 24. boost asio prenant 100% cpu à lire
- 25. boost asio ssl flux socket compilation problème
- 26. boost :: asio tcp async_read ne retourne jamais
- 27. boost :: asio, erreur de lecture asynchrone
- 28. Ressource temporairement indisponible dans Boost ASIO
- 29. Verbosité dans boost asio en utilisant ssl
- 30. Boost Asio sous Linux n'utilisant pas Epoll
Je préférerais ne pas utiliser de pointeurs intelligents, car les pointeurs bruts sont plus natifs pour moi. – vladimir
@vladimir, juste parce que vous sentez que quelque chose est plus natif, ne fait pas une bonne pratique. Les pointeurs intelligents résolvent beaucoup de problèmes qui autrement peuvent être un ballache :) –
+1 pour l'utilisation de "ballache" dans une phrase. –