чем отличается boost :: asio :: ip :: tcp :: socket :: cancel и socket :: close

Согласно документации boost, при вызове socket::close() асинхронные операции отправки, получения или подключения будут немедленно отменены и завершатся с ошибкой boost::asio::error::operation_aborted.

socket::cancel вызывает немедленное завершение всех невыполненных асинхронных операций подключения, отправки и получения, а обработчикам отмененных операций будет передана boost::asio::error::operation_aborted ошибка.

Есть ли между ними какая-то разница?

Когда я хочу завершить одно соединение сокета, какой из них я должен вызвать, чтобы их обработчик обратного вызова вызывал с ошибкой boost::asio::error::operation_aborted?


person xiao su    schedule 21.06.2011    source источник


Ответы (1)


Есть ли между ними какая-то разница?

да. Метод close() закрывает сокет, а метод cancel() отменяет невыполненные асинхронные операции. Использование cancel() не закрывает сокет.

Когда я хочу завершить одно подключение к сокету, какой из них мне следует позвонить?

Вы должны использовать cancel(), чтобы остановить все невыполненные асинхронные операции. Сокет будет закрыт его деструктором.

person Sam Miller    schedule 21.06.2011
comment
Итак, если я использую close, а не отмену, есть какие-то проблемы? Функция close может закрыть сокет, и любые невыполненные асинхронные операции останавливаются, возвращая ошибку boost :: asio :: error :: operation_aborted, почему я должен использовать cancel вместо close. я беспокоюсь, если выполняются некоторые асинхронные операции, отмена не может отменить, да? как asio :: ip :: tcp :: resolve :: cancel, я много раз пытаюсь отменить resolve_handler после вызова async_resolve, но resolve_handler всегда возвращается без boost :: asio :: error :: operation_aborted error. я думаю, что resolve_handler был выполнение? да? - person xiao su; 22.06.2011
comment
@xiao нет проблем с использованием close, если вы собираетесь закрыть сокет. Предлагаю вам задать дополнительные вопросы об async_resolve. Если мой ответ вам помог, примите его. - person Sam Miller; 23.06.2011