C++ 在不关闭本机处理程序的情况下销毁Boost Asio套接字
我面临以下问题。我正在尝试使用带有boost Asio的第三方库,我需要在io_服务事件循环中注入库使用的一些套接字描述符 我使用的方法是创建一个boost::asio::ip::tcp::socket,传递我的库提供的本机处理程序 问题是,库只会传达它对特定套接字通知不感兴趣的信息(这意味着库可能会在以后关闭套接字或重用它)。在任何情况下,我都希望清理boost套接字并销毁它们,但不关闭本机处理程序(即文件描述符) 简言之,有没有办法在不关闭底层处理程序的情况下销毁boost::asio::ip::tcp::socket?我知道应该改用posix::stream_描述符,但我希望我的解决方案是可移植的 但我希望我的解决方案是可移植的 当您触摸本机句柄时,程序就不再是可移植的C++ 在不关闭本机处理程序的情况下销毁Boost Asio套接字,c++,sockets,tcp,boost-asio,C++,Sockets,Tcp,Boost Asio,我面临以下问题。我正在尝试使用带有boost Asio的第三方库,我需要在io_服务事件循环中注入库使用的一些套接字描述符 我使用的方法是创建一个boost::asio::ip::tcp::socket,传递我的库提供的本机处理程序 问题是,库只会传达它对特定套接字通知不感兴趣的信息(这意味着库可能会在以后关闭套接字或重用它)。在任何情况下,我都希望清理boost套接字并销毁它们,但不关闭本机处理程序(即文件描述符) 简言之,有没有办法在不关闭底层处理程序的情况下销毁boost::asio::i
但是,一旦您接受了这一点,就可以调用
dup()
[unix]或DuplicateHandle()
[windows]在本机句柄上。您可以尝试切换到posix::stream\u描述符并使用其方法。否。如果不关闭本机处理程序,就无法销毁ip::tcp::socket
。这无法移植实现,因此Asio不支持它。特别是,在Windows 8.1之前,一旦套接字与I/O完成端口关联,则只能通过关闭it1来解除套接字的关联。请参阅Chris Kohlhoff响应此功能请求的相关github问题:
这是不受支持的,因为它无法移植实现。具体来说,在Windows上,套接字与I/O完成端口关联,不能解除关联
如果您只针对基于POSIX的系统,那么也许您可以将描述符粘贴到POSIX::stream_描述符中?此类提供了一个release()
成员函数
一,。Windows 8.1启用了在不关闭套接字的情况下通过删除完成端口关联。实际上,我不打算接触本机句柄,Asio和其他库在Windows和unix中都使用相同的本机句柄。您是否尝试使用哑套接字,即使失败,也可能是先前的将不再可用…@JeanDavysocket.assign(协议,本机)
有一个先决条件,即socket
未打开(请参阅)。如果不满足此前提条件,则socket
的状态保持不变。是否可以在常规windows应用程序中使用NtSetInformationFile
?这是留给司机的吗?