2013-03-09 69 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

相關問題