Использование boost :: asio :: ip :: tcp :: socket :: cancel () и socket :: close () - PullRequest
3 голосов
/ 22 июня 2011

Если я использую close, а не отмену, возникают некоторые проблемы.

Функция close может закрыть сокет, и любые незавершенные асинхронные операции останавливаются, возвращая ошибку boost::asio::error::operation_aborted.

Почему я должен использовать cancel вместо close?

Я беспокоюсь, если выполняются некоторые асинхронные операции, cancel не может отменить его, да?

Как и asio::ip::tcp::resolve::cancel, я много раз пытаюсь отменить resolve_handler после вызова async_resolve, но resolve_handler всегда возвращается без ошибки boost::asio::error::operation_aborted.

Я думаю, resolve_handler выполняется?

Да

Ответы [ 2 ]

6 голосов
/ 22 июня 2011

cancel не закроет сокет, поэтому используйте cancel, если вы собираетесь продолжать использовать объект сокета. В частности, если у вас есть код в асинхронных методах-обработчиках, который ссылается на функции-члены сокета, вы можете не захотеть закрывать сокет, пока не убедитесь, что выполняемые в настоящее время асинхронные обработчики завершены.

cancel не гарантирует что-либо о выполняющихся в настоящее время асинхронных обработчиках, он только гарантирует (согласно документации надстройки), что «эта функция заставляет все незавершенные асинхронные операции соединения, отправки и получения немедленно завершиться» в случае socket::cancel() call, или «Эта функция принудительно завершает любые ожидающие асинхронные операции с распознавателем хоста» в случае вызова resolver::cancel(). Это «завершение» означает, что boost будет вызывать ваш асинхронный метод-обработчик, и у него нет юрисдикции для внедрения какой-либо логики отмены в ваш асинхронный обработчик (не говоря уже о том, что он не знает о реализации обработчика с самого начала).

Я бы предложил добавить вашу собственную логику в метод асинхронного обработчика, чтобы обработать случай, когда используется сокет / resolver / и т.д. отменено Если вы вызываете метод отмены, то, скорее всего, у вас есть возможность сообщить об этом отмене асинхронному методу-обработчику.

6 голосов
/ 22 июня 2011

Отмена полезна, если вы хотите остановить ожидающие операции без закрытия сокета.

Обратите внимание, что документация Boost рекомендует использовать close для большей переносимости (со страницы документа):

... Для портативного отмены рассмотрите возможность использования одной из следующих альтернатив:

  • Отключите серверную часть порта завершения ввода / вывода asio, определив BOOST_ASIO_DISABLE_IOCP.
  • Используйте функцию close () для одновременной отмены ожидающих операций и закрытия сокета.
...