2010-12-09 48 views
4

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

2

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.

+0

Je préférerais ne pas utiliser de pointeurs intelligents, car les pointeurs bruts sont plus natifs pour moi. – vladimir

+5

@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

+1 pour l'utilisation de "ballache" dans une phrase. –

1

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.

+0

sûrement, il en résulte seulement une RST si vous éteignez explicitement s'attarder ... –