我想要的是简单的 - 从boost asio socket创建新的C ++ / CLI .Net套接字的代码示例。如何创造这样的东西?
以下是我想要做的伪代码:
.net::socket a;
boost::asio::socket b;
a.assign(b.nativeWin32Socket());
的方法
答案 0 :(得分:8)
你不能'分离'Boost.ASIO套接字。您可以使用native_handle()
成员函数从SOCKET
对象获取asio::socket
句柄,但必须确保asio::socket
对象在完成之前不会被破坏使用SOCKET
。它继续拥有本机SOCKET
的所有权,并在调用析构函数时将其关闭。
André建议,您可以复制套接字句柄。但是,我不会考虑复制此套接字安全,因为Boost.ASIO会自动将本机SOCKET
句柄与I / O完成端口相关联。如果.NET Socket包装器或某些其他代码尝试将重复的套接字与不同的I / O完成端口关联,则会发生错误。我知道.NET 2.0 Socket类实际上将SOCKET
句柄与用于异步操作的I / O完成端口相关联。但是,在最近的版本中,这可能已经发生了变化。
答案 1 :(得分:3)
您可以使用WSADuplicateSocket()
返回的PROTOCOL_INFO
结构,将其转换为SocketInformation
等效项,然后使用appropriate socket constructor获取具有不同句柄的共享套接字
WSADuplicateSocket()
文档中的“备注”部分描述了套接字重复中常见的控制流程。我认为此流程有点等同于SocketInformation Socket::DuplicateAndClose()
和Socket(SocketInformation)
对调用。