在不关闭本机处理程序的情况下销毁Boost Asio套接字

时间:2016-08-11 21:54:36

标签: c++ sockets tcp boost-asio

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

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

问题是库只是通信它对特定的套接字通知不感兴趣(这意味着库可能会关闭套接字或在以后重用它)。在任何情况下,我都想清理boost套接字并销毁它们,但不关闭本机处理程序(即文件描述符)。

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

3 个答案:

答案 0 :(得分:2)

没有。没有关闭本机处理程序就无法销毁ip::tcp::socket。这不能轻松实现,因此Asio不支持它。特别是,在Windows 8.1之前,一旦套接字与I / O完成端口关联,套接字只能通过关闭 1 来取消关联。请参阅{Koverhoff回应此功能请求的this相关github问题:

  

不支持此功能,因为无法轻松实现。具体来说,在Windows上,套接字与I / O完成端口关联,不能取消关联。

     

如果您只针对基于POSIX的系统,那么您可以将描述符添加到posix::stream_descriptor中吗?该类确实提供了release()成员函数。

<子> 1。 Windows 8.1启用通过FileReplaceCompletionInformation删除完成端口关联,而不关闭套接字。

答案 1 :(得分:0)

  

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

当您触摸本机句柄时,该程序不再可移植。

但是,一旦你接受了这个术语,你可以在原生句柄上调用dup() [unix]或DuplicateHandle() [windows]。

答案 2 :(得分:0)

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