[英]Boost.Asio TCP moved-to socket destructor not enough to cleanly close?
[英]Boost.Asio socket destructor closes connection?
boost::asio::ip::tcp::socket
的析構函數到底是做什么的? 我不知道,即使在瀏覽Boost文檔和源代碼之后,如果我需要使用它
socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
socket->close();
在打電話之前
delete socket;
我是否需要手動關閉套接字,或者析構函數是否處理此問題?
當一個插座被破壞,它將作為-如果由封閉socket.close(ec)
的插座的破壞期間。
I / O對象(如socket
)派生自basic_io_object
。 在basic_io_object
析構函數中 ,將在I / O對象的I / O服務上調用destroy()
,傳入I / O對象服務將在其上運行的implementation_type
實例。 在socket的情況下,將在滿足SocketService類型要求的類型上調用destroy()
,關閉底層套接字。 在下面的文檔中, a
是套接字服務類的實例, b
是套接字服務類的implementation_type
的實例:
a.destroy(b)
:[...]隱式取消異步操作,就像調用
a.close(b, ec)
。
a.close(b, ec)
:如果
a.is_open()
為true,則會導致任何未完成的異步操作盡快完成。 取消操作的處理程序應傳遞錯誤代碼error::operation_aborted
。發布:
!a.is_open(b)
。
不,你不需要關閉它。 雖然這樣做可能更干凈,但如果要報告協議關閉周圍的任何錯誤。
析構函數只是/出現/是空的,這是Modern C ++的一個好兆頭:
答案已經跳過了shutdown()的問題。 從close()文檔,“關於正常關閉連接套接字的可移植行為,在關閉套接字之前調用shutdown()”。
如果刪除套接字是隱式關閉,則在刪除之前似乎仍然建議調用shutdown()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.