Разъемы Boost :: asio - как правильно их отключить? - PullRequest
4 голосов
/ 09 декабря 2010

Я использую бустовые асинхронные сокеты для моего серверного приложения.Я создал функцию disconnect (), которая вызывает метод close (), а затем удаляет сокет (оператор delete).И это нормально, когда функция вызывается с одного из асинхронных.обработчики, но когда я вызываю его из своей основной кодовой базы, все приложение вылетает в одном из асинхронных обработчиковКак красиво закрыть розетку в boost?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

Убедитесь, , что объект жив, пока существуют обработчики, которые могут его использовать.

Вполне вероятно, что один из обработчиков, использующих этот сокет, вызывается после того, как вы вызываете close (так как сообщает об ошибке обработчику), а затем обращается к мертвому указателю ...

Обычно обработка времени жизни может быть легко выполнена с помощью boost::shared_ptr и boost::enable_shared_from_this и передачей ее в обработчики. Смотрите многочисленные примеры, предоставляемые с Boost.Asio.

Как только вы познакомитесь с этой техникой, вопрос, который вы задали, будет для вас тривиальным.

1 голос
/ 09 декабря 2010

Вы также хотите посмотреть на метод выключения на сокете.Это не решит ваше сбойное приложение.Артём выше уже объяснил причину этого, но тем не менее это интересно.Если вы закроете сокет без вызова shutdown, это может привести к отправке RST вместо изящного рукопожатия FIN.

...