如何将boost::asio套接字转换为C++/CLI .Net套接字?

5
我希望的很简单 - 提供一个创建新的C++/CLI .Net socket的boost asio socket示例代码。如何创建这样的东西?
以下是我想要实现的伪代码:
.net::socket a;
boost::asio::socket b;
a.assign(b.nativeWin32Socket());

顺便说一下:这是如何将C++/CLI .Net socket转换为boost::asio socket的方法。


不是一个选项,接受(封装的)套接字句柄的构造函数是私有的。 - Hans Passant
2
@HansPassant:是的,但这个链接是公开的。警告:不包含电池。 - Ben Voigt
2个回答

8
您无法“分离”Boost.ASIO套接字。您可以使用native_handle()成员函数从asio::socket对象获取SOCKET句柄,但必须确保asio::socket对象在您完成对SOCKET的操作之前不会被销毁。它继续持有本地SOCKET的所有权,并在其析构函数被调用时关闭它。
正如André所建议的那样,您可以复制套接字句柄。然而,我不认为复制此套接字是安全的,因为Boost.ASIO自动将本地SOCKET句柄与I/O完成端口相关联。如果.NET Socket包装器或其他代码尝试将复制的套接字与不同的I/O完成端口相关联,则会发生错误。我知道.NET 2.0 Socket类实际上会将SOCKET句柄与I/O完成端口关联起来以进行异步操作。然而,这在更近期的版本中可能已经改变了。

2
或者使用 WSADuplicateSocket,这样当 Boost 关闭句柄时,您仍然拥有一个独立的句柄来保持套接字打开。 (假设 Boost 调用 closesocket 而不是 shutdown - Ben Voigt
即使无法分离套接字,仍可复制套接字句柄,以便两个抽象可以通过两个不同的句柄共享同一个套接字。 - André Caron
Boost实现将SOCKET句柄与I/O完成端口相关联。除非您100%确定没有其他代码尝试将其与第二个I/O完成端口相关联,否则我不认为复制此套接字是安全的。我知道2.0 .NET Socket类在内部使用IOCP进行异步操作,但这可能已经在以后的版本中更改了。 - Collin Dauphinee

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接