【问题标题】:Boost.Asio socket destructor closes connection?Boost.Asio 套接字析构函数关闭连接?
【发布时间】:2017-02-10 07:17:24
【问题描述】:

boost::asio::ip::tcp::socket 的析构函数究竟做了什么?即使在搜索 Boost 文档和源代码之后,我也无法判断是否需要使用

socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
socket->close();

打电话之前

delete socket;

我需要手动关闭套接字,还是由析构函数处理?

【问题讨论】:

  • source code好像没有。
  • 我知道。这很奇怪,因为套接字似乎会执行一些清理,但我认为我只是没有找到正确的代码。
  • 没有。它必须是正确的代码,因为它直接来自 boost 网站,除非发生了一些奇怪的活动。但关键是没有析构函数,所以你必须自己关闭并关闭套接字。明白了吗?
  • @amanuel2 看我的回答。
  • @amanuel2 所有 I/O 对象都将清理工作推迟到它们都派生自 basic_io_object

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


【解决方案1】:

当一个socket被销毁时,它会在socket销毁期间被socket.close(ec)关闭as-if

I/O 对象,例如 socket,派生自 basic_io_object。在basic_io_object destructor 中,将在I/O 对象的I/O 服务上调用destroy(),传入implementation_type 的实例,I/O 对象的服务将在该实例上运行。在套接字的情况下,destroy() 将在满足 SocketService 类型要求的类型上调用,关闭底层套接字。在下面的文档中,a 是套接字服务类的一个实例,b 是套接字服务类的implementation_type 的一个实例:

a.destroy(b):

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

a.close(b, ec):

如果a.is_open() 为真,则导致所有未完成的异步操作尽快完成。取消操作的处理程序应传递错误代码error::operation_aborted

发帖:!a.is_open(b)

【讨论】:

    【解决方案2】:

    不,您不需要关闭它。虽然这样做可能更简洁,但如果您想报告有关协议关闭的任何错误。

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

    【讨论】:

    • 是的,他必须手动手动关闭套接字连接。并自己实现“析构函数”。很好的答案。
    • @sehe - 析构函数是否完全断开连接,执行有问题的两个调用?还是只是突然关闭连接?
    • @amanuel2 不,他不必手动关闭套接字连接自己实现析构函数。毫无意义的评论。
    • @EJP 是的,他必须手动关闭套接字,所以socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both); socket->close();
    • @amanuel,如果你观察到套接字的析构函数没有关闭底层的原生套接字,那么请提交一份针对 Asio 的错误报告。根据文档和实现,应在销毁套接字期间关闭本机套接字。
    【解决方案3】:

    答案已经跳过了 shutdown() 的问题。来自 close() 文档,“对于与优雅关闭连接的套接字有关的可移植行为,请在关闭套接字之前调用 shutdown()”。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      相关资源
      最近更新 更多