【问题标题】:Destroying Boost Asio socket without closing native handler在不关闭本机处理程序的情况下销毁 Boost Asio 套接字
【发布时间】:2016-08-11 21:54:36
【问题描述】:

我面临以下问题。我正在尝试使用带有 boost Asio 的第三方库,并且我需要在 io_service 事件循环中注入该库使用的一些套接字描述符。

我使用的方法是创建一个 boost::asio::ip::tcp::socket 传递我的库提供的本机处理程序。

问题是库只会传达它对特定套接字通知不感兴趣(这意味着库可能会关闭套接字或稍后重用它)。无论如何,我想清理 boost 套接字并销毁它们,但不关闭本机处理程序(即文件描述符)。

简而言之,有没有办法在不关闭底层处理程序的情况下销毁 boost::asio::ip::tcp::socket?我知道改用 posix::stream_descriptor,但我希望我的解决方案是可移植的。

【问题讨论】:

  • 你有没有试过assign一个哑套接字,即使失败也可能以前的将不再可用...
  • @JeanDavy socket.assign(protocol, native) 具有socket 未打开的前提条件(请参阅SocketService)。如果不满足此前提条件,则socket 的状态保持不变。

标签: c++ sockets tcp boost-asio


【解决方案1】:

没有。如果不关闭本机处理程序,就无法销毁ip::tcp::socket。这不能移植实现,因此 Asio 不支持它。特别是在 Windows 8.1 之前,一旦一个套接字与一个 I/O 完成端口相关联,该套接字只能通过关闭它来解除关联1。请参阅this 相关 github 问题,其中 Chris Kohlhoff 响应此功能请求:

不支持此功能,因为它无法以可移植方式实现。具体来说,在 Windows 上,套接字与 I/O 完成端口相关联,并且无法解除关联。

如果您只针对基于 POSIX 的系统,那么也许您可以将描述符粘贴到 posix::stream_descriptor 中?这个类确实提供了一个release() 成员函数。


1。 Windows 8.1 允许通过FileReplaceCompletionInformation 删除完成端口关联而不关闭套接字。

【讨论】:

  • 是否可以在常规 Windows 应用程序中使用NtSetInformationFile?这是为司机保留的吗?
【解决方案2】:

但我希望我的解决方案是可移植的

当您触摸原生句柄时,程序不再是可移植的。

但是,一旦您接受了这一点,您可以在本机句柄上调用 dup() [unix] 或 DuplicateHandle() [windows]。

【讨论】:

  • 其实我并不打算接触原生句柄,Asio和其他库在windows和unix中都使用相同类型的原生句柄。
【解决方案3】:

您可以尝试切换到 posix::stream_descriptor 并使用其release 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多