Если вы хотите повторно использовать экземпляр потока, вам нужно манипулировать SSL_Socket.native_handle()
с помощью функции openssl lib.После выключения ssl, используйте SSL_clear()
перед началом нового рукопожатия ssl.
прочитайте (обратите внимание на предупреждения) ссылка для подробностей
SSL_clear () сбрасывает объект SSL, чтобы разрешить другое соединение.Однако операция сброса сохраняет некоторые настройки последних сеансов (некоторые из этих настроек были сделаны автоматически во время последнего рукопожатия) .........
ПРЕДУПРЕЖДЕНИЯ
SSL_clear () сбрасывает объект SSL, чтобы разрешить другое соединение.Однако операция сброса сохраняет некоторые настройки последних сеансов (некоторые из этих настроек были сделаны автоматически во время последнего рукопожатия).Это имеет смысл только для нового соединения с точно таким же одноранговым узлом, который разделяет эти параметры, и может потерпеть неудачу, если этот одноранговый узел изменяет свои настройки между соединениями.Используйте последовательность SSL_get_session (3);SSL_new (3);SSL_set_session (3);SSL_free (3) вместо этого, чтобы избежать таких сбоев (или просто SSL_free (3); SSL_new (3), если повторное использование сеанса нежелательно).
Что касается проблемы с отключением ssl, link Объясните, как работает boost asio ssl shutdown.
В Boost.Asio операция shutdown () считается завершенной в случае ошибки или если участник отправил и получил сообщение close_notify.
Если вы посмотрите на boostИсходный код .asio (1.68) boost \ asio \ ssl \ detail \ impl \ engine.ipp показывает, как boost.asio выполняет ssl-выключение и stream_truncated
происходит, когда есть данные, которые нужно прочитать, или ssl-завершение ожидается изПэр не получил .
int engine::do_shutdown(void*, std::size_t)
{
int result = ::SSL_shutdown(ssl_);
if (result == 0)
result = ::SSL_shutdown(ssl_);
return result;
}
const boost::system::error_code& engine::map_error_code(
boost::system::error_code& ec) const
......
// If there's data yet to be read, it's an error.
if (BIO_wpending(ext_bio_))
{
ec = boost::asio::ssl::error::stream_truncated;
return ec;
}
......
// Otherwise, the peer should have negotiated a proper shutdown.
if ((::SSL_get_shutdown(ssl_) & SSL_RECEIVED_SHUTDOWN) == 0)
{
ec = boost::asio::ssl::error::stream_truncated;
}
}
Также вы можете увидеть, что процедура завершения работы boost.asio ssl может дважды вызвать openssl SSL_shutdown()
, если вначале вернет 0, документ openssl разрешит это, но вызов по совету SSL_read()
для двунаправленного отключения, если сначала SSL_shutdown()
возвращает 0.
Считайте ссылку для подробностей.