У меня есть небольшой клиент ssl, который я запрограммировал в boost 1.55 asio, и я пытаюсь понять, почему boost::asio::ssl::stream::async_shutdown()
всегда терпит неудачу. Клиент очень похож (почти идентичный) на примеры клиентов ssl в документации по ускорению, поскольку он проходит последовательность обратного вызова boost::asio::ip::tcp::resolver::async_resolve()
→ boost::asio::ssl::stream::async_connect()
→ boost::asio::ssl::stream::async_handshake()
. Все это работает так, как ожидалось, и обратный вызов async_handshake()
получает всплывающее окно boost::system::error_code
.
Из обратного вызова async_handshake()
я вызываю async_shutdown()
(я не передаю никаких данных - этот объект больше подходит для проверки рукопожатия):
void ClientCertificateFinder::handle_handshake(const boost::system::error_code& e)
{
if ( !e )
{
m_socket.async_shutdown( boost::bind( &ClientCertificateFinder::handle_shutdown_after_success,
this,
boost::asio::placeholders::error ) );
}
else
{
m_handler( e, IssuerNameList() );
}
}
handle_shutdown_after_success()
затем вызывается, но всегда с ошибкой? Ошибка - value = 2 в asio.misc
, что является "Конец файла". Я пробовал это с помощью множества серверов ssl, и я всегда получаю эту ошибку asio.misc
. То, что это не основная ошибка openssl, подсказывает мне, что я мог бы неправильно использовать asio...?
Кто-нибудь знает, почему это может произойти? У меня создалось впечатление, что закрытие соединения с async_shutdown()
было правильным делом, но я думаю, я мог просто позвонить boost::asio::ssl::stream.lowestlayer().close()
, чтобы закрыть сокет из-под opensl, если это ожидаемый способ сделать это (и действительно примеры asio ssl, похоже, указывают на то, что это правильный способ закрытия).