#boost #ssl #openssl #boost-asio
#повышение #ssl #openssl #повышение-asio
Вопрос:
Я пытаюсь обработать сценарии ошибок SSL, в которых, например, SSL async_handshake () выполняется слишком долго. Через некоторое время (скажем, через 20 секунд) я хочу закрыть это соединение (lowest_layer().close()). Я передаю shared_ptr с объектом подключения в качестве параметра в async_handshake (), поэтому объект все еще существует, в конечном итоге вызывается обработчик рукопожатия, и объект уничтожается.
Но, тем не менее, я получаю спорадические сбои! Похоже, что после close () SSL все еще пытается прочитать или оперировать буфером чтения.
Итак, основной вопрос — безопасно ли жестко закрывать () SSL-соединение?
Есть идеи?
Ответ №1:
Обычно используемый мной метод остановки незавершенных асинхронных операций над сокетом socket::cancel
таков, как описано в документации. Их обработчики будут вызваны с asio::error::operation_aborted
в качестве параметра ошибки, с которым вам нужно будет как-то справиться.
Тем не менее, я не вижу проблемы с использованием close
вместо cancel
. Хотя трудно предложить большую помощь или совет без некоторого кода для анализа.
Обратите внимание, что на некоторых платформах Windows возникают проблемы при отмене невыполненных асинхронных операций. В документации есть предложения по переносной отмене, если вашему приложению требуется поддержка Windows.
Комментарии:
1. Это не помогает в случае async_handshake, по крайней мере, для меня.
2. @PSIAlt добавил ссылку на документы о платформах Windows и ограничениях с
cancel()
3. Спасибо, но у меня та же проблема, что и с OP в Linux. Это легко воспроизвести: настройте async_handshake и установите deadline_timer примерно на 2-5 миллисекунд. По этому таймеру я закрываю базовое соединение для
ssl::stream
использованияlowest_layer().close()
и дампы ядра приложения внутриSSL_connect
.. Не знаю, как это исправить, просто увеличил таймер на данный момент