Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不关闭本机处理程序的情况下销毁Boost Asio套接字_C++_Sockets_Tcp_Boost Asio - Fatal编程技术网

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

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

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

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

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

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

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

当您触摸本机句柄时,程序就不再是可移植的


但是,一旦您接受了这一点,就可以调用
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中都使用相同的本机句柄。您是否尝试使用哑套接字,即使失败,也可能是先前的将不再可用…@JeanDavy
socket.assign(协议,本机)
有一个先决条件,即
socket
未打开(请参阅)。如果不满足此前提条件,则
socket
的状态保持不变。是否可以在常规windows应用程序中使用
NtSetInformationFile
?这是留给司机的吗?