Boost.Asio socket析构函数关闭连接?

时间:2016-10-02 01:37:33

标签: c++ sockets boost network-programming boost-asio

boost::asio::ip::tcp::socket的析构函数到底是做什么的?即使在浏览Boost文档和源代码之后,如果我需要使用

,我也无法说出来。
socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
socket->close();

之前打电话

delete socket;

我是否需要手动关闭套接字,或者析构函数是否处理此问题?

3 个答案:

答案 0 :(得分:6)

当套接字被销毁时,在销毁套接字期间,socket.close(ec)将关闭 as-if

I / O对象(例如 mBrowseFrame.setOnFocusSearchListener(mOnFocusSearchListener); )派生自basic_io_object。在basic_io_object destructor中,将在I / O对象的I / O服务上调用socket,传入I / O对象的destroy()实例&# 39;服务将运作。对于socket,将在满足SocketService类型要求的类型上调用implementation_type,关闭底层套接字。在下面的文档中,destroy()是套接字服务类的实例,a是套接字服务类的b的实例:

  

implementation_type

     
    

[...]隐式取消异步操作,就像调用a.destroy(b)

一样   
     

a.close(b, ec)

     
    

如果a.close(b, ec)为true,则会导致任何未完成的异步操作尽快完成。取消操作的处理程序应传递错误代码a.is_open()

         

发布:error::operation_aborted

  

答案 1 :(得分:4)

不,你不需要关闭它。虽然这样做可能更干净,但如果您想报告协议关闭周围的任何错误。

析构函数只是/出现/是空的,这是Modern的一个好兆头  C ++:

答案 2 :(得分:3)

关于shutdown()的问题已经跳过了答案。从close()文档,“关于正常关闭连接套接字的可移植行为,在关闭套接字之前调用shutdown()”。

如果删除套接字是隐式关闭,则在删除之前仍然建议调用shutdown()。