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