[英]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.