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

时间:2011-09-21 15:41:49

标签: .net c++ sockets boost c++-cli

我想要的是简单的 - 从boost asio socket创建新的C ++ / CLI .Net套接字的代码示例。如何创造这样的东西?

以下是我想要做的伪代码:

.net::socket a;
boost::asio::socket b;
a.assign(b.nativeWin32Socket());

BTW:以下是turn C++/CLI .Net socket into boost::asio socket.

的方法

2 个答案:

答案 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)对调用。