我正面临以下问题。我正在尝试使用带有boost Asio的第三方库,我需要在io_service事件循环中注入库中使用的一些套接字描述符。
我使用的方法是创建一个boost :: asio :: ip :: tcp :: socket,传递我的库提供的本机处理程序。
问题是库只是通信它对特定的套接字通知不感兴趣(这意味着库可能会关闭套接字或在以后重用它)。在任何情况下,我都想清理boost套接字并销毁它们,但不关闭本机处理程序(即文件描述符)。
简而言之,有没有办法在不关闭底层处理程序的情况下销毁boost :: asio :: ip :: tcp :: socket?我知道使用posix :: stream_descriptor,但我希望我的解决方案是可移植的。
答案 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方法。