关闭boost asio ssl socket时需要调用ssl :: stream :: shutdown吗?

时间:2013-03-09 15:10:18

标签: c++ sockets boost ssl boost-asio

我的代码如下:

declaration: boost::asio::ssl::stream<boost::asio::ip::tcp::socket> m_remote_socket;

m_remote_socket.shutdown(ec);
if (ec)
{      
    cdbug<<"id: "<<m_id<<", error when ssl shutdown: "    <<boost::system::system_category().message(ec.value()).c_str(); 
}
m_remote_socket.lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
if (ec)
{
    cdbug<<"id: "<<m_id<<", error when tcp shutdown: "<<boost::system::system_category().message(ec.value()).c_str(); 
}

每次拨打m_remote_socket.shutdown时,都会收到错误消息。这种未知错误,误差很大。

但可以直接致电m_remote_socket.lowest_layer().shutdown()而无需致电m_remote_socket.shutdown

有人能告诉我如何关闭ssl流式套接字吗?

3 个答案:

答案 0 :(得分:2)

shutdown()及其ssl::stream进行lowest_layer()来电最为清晰。第一个ends the SSL connection和第二个ends the TCP connection。如果您在SSL关闭时收到错误,则可能是另一方在结束连接方面没有那么优雅。

答案 1 :(得分:2)

只需调用close()即可。关闭SSL套接字是不合法的:SSL中没有半关闭。请参阅RFC 2246,关于close_notify的讨论。

答案 2 :(得分:1)

我强烈建议您不要使用关机方法,也不要尊重SSL层+ TCP层(lowest_layer)。保持安全并关闭tcp lowest_layer

m_remote_socket.lowest_layer()关闭(EC);

我遇到的问题是,当您尊重SSL或TCP时,应用程序资源(套接字处理程序)将在内存中存储,直到服务器端发送关闭会话确认。