boost asio ssl async_shutdown sempre termina com um erro?
Eu tenho um pequeno cliente ssl que programei no boost 1.55 asio, e estou tentando descobrir por queboost::asio::ssl::stream::async_shutdown()
sempre falha. O cliente é muito semelhante (quase idêntico) aos exemplos de clientes ssl na documentação do boost, na medida em que passa por umboost::asio::ip::tcp::resolver::async_resolve()
->boost::asio::ssl::stream::async_connect()
->boost::asio::ssl::stream::async_handshake()
sequência de retorno de chamada. Tudo isso funciona como esperado e oasync_handshake()
retorno de chamada fica totalmenteboost::system::error_code
.
Deasync_handshake()
retorno de chamada, eu ligoasync_shutdown()
(Eu não transfiro nenhum dado - este objeto é mais para testar o aperto de mão):
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()
é então chamado, mas sempre com um erro? O erro é value = 2 inasio.misc
, que é 'Fim do arquivo'. Eu tentei isso com uma variedade de servidores ssl, e sempre pareço entender issoasio.misc
erro. O fato de este não ser um erro openssl subjacente sugere que eu possa estar usando mal o asio de alguma forma ...?
Alguém sabe por que isso pode estar acontecendo? Fiquei com a impressão de que desligando a conexão comasync_shutdown()
era a coisa certa a fazer, mas acho que eu poderia ligarboost::asio::ssl::stream.lowestlayer().close()
fechar o soquete do openssl se essa é a maneira esperada de fazer isso (e de fato os exemplos asio ssl parecem indicar que esta é a maneira correta de desligar).