2013-03-09 134 views
3

我的代码如下:需要在关闭boost asio ssl套接字时调用ssl :: stream :: shutdown?

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流式套接字?

+0

什么是关机失败时的错误代码和消息? – 2013-03-10 04:15:40

回答

2

ssl::streamlowest_layer()上都调用shutdown()调用最干净。第一个ends the SSL connection和第二个ends the TCP connection。如果您在SSL关闭时遇到错误,则可能是另一方在结束连接时不够优雅。

+1

这是不正确的。基于SSL连接的TCP连接半封闭是不合法的。见RFC 2246. – EJP 2013-03-10 08:57:48

+0

@EJP,我不确定我明白你的意思。在较低的协议层之前应该关闭SSL连接并不会阻止您与通信的一方关闭或丢弃TCP。我只是试图解释为什么当您尝试关闭SSL时可能会出现错误。 – rhashimoto 2013-03-10 15:24:52

+0

@rashimodo没有半封闭的SSL连接。一方收到close_notify后,必须关闭连接。令我惊讶的是,正在讨论的图书馆甚至提供了SSL关机功能,但如果它确实有效,那么结果必须是完全关闭的连接。关闭底层TCP连接的一端会使SSL处于无效状态。这个答案不正确。 – EJP 2013-03-10 23:04:48

1

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

+2

“关闭”的定义是什么?我认为我们中的一个人存在语义上的误解。 [OpenSSL关机概念](http://www.openssl.org/docs/ssl/SSL_shutdown.html)发送'close_notify',这就是'boost :: asio'调用的内容。 – rhashimoto 2013-03-11 00:13:11

+0

关闭的TCP概念是半关闭:在保持另一方向打开的同时在一个方向上发送FIN。这是'shutdown(SHUT_WR)'所做的。 close_notify的SSL概念是完全关闭的。 '目前公开的会议被视为关闭'。他们不可调和。 – EJP 2013-03-11 02:37:52

+0

这就是为什么我的回答说在'ssl :: stream'上调用'shutdown()'。 **不**发送FIN并结束TCP连接;它调用发送'close_notify'的OpenSSL'SSL_shutdown'。 'ssl :: stream :: shutdown()'=='close_notfify'。 'SSL_shutdown()'!= TCP FIN。 – rhashimoto 2013-03-11 02:49:51

相关问题