Повышение.Неблагодарное закрытие Asio SSL

#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 .. Не знаю, как это исправить, просто увеличил таймер на данный момент