【问题标题】:how to turn boost::asio socket into C++/CLI .Net socket?如何将 boost::asio 套接字转换为 C++/CLI .Net 套接字?
【发布时间】:2011-11-22 02:11:32
【问题描述】:

我想要的很简单——从 boost asio 套接字创建新的 C++/CLI .Net 套接字的代码示例。这样的东西怎么制作?

这是我想做的伪代码:

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

顺便说一句:这是turn C++/CLI .Net socket into boost::asio socket.的方法

【问题讨论】:

  • 不是一个选项,采用(包装的)套接字句柄的构造函数是私有的。
  • @HansPassant:是的,但this one 是公开的。警告:不包括电池。

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


【解决方案1】:

您不能“分离”Boost.ASIO 套接字。您可以使用native_handle() 成员函数从asio::socket 对象中获取SOCKET 句柄,但您必须确保在您完成SOCKET 之前不会破坏asio::socket 对象。它继续持有本机SOCKET 的所有权,并在调用它的析构函数时将其关闭。

就像 André 建议的那样,您可以复制套接字句柄。但是,我不会考虑复制此套接字安全,因为 Boost.ASIO 自动将本机 SOCKET 句柄与 I/O 完成端口相关联。如果 .NET Socket 包装器或其他代码尝试将复制的套接字与不同的 I/O 完成端口相关联,则会发生错误。事实上,我知道 .NET 2.0 Socket 类确实将 SOCKET 句柄与异步操作的 I/O 完成端口相关联。不过,这在最近的版本中可能有所改变。

【讨论】:

  • 或者使用WSADuplicateSocket,那么Boost关闭句柄的时候并不重要,你有一个独立的句柄来保持它打开的同一个套接字。 (假设 Boost 调用 closesocket 而不是 shutdown
  • 即使你不能分离socket,你仍然可以duplicate the socket handle这样两个抽象可以通过两个不同的句柄共享同一个socket。
  • Boost 实现将 SOCKET 句柄与 I/O 完成端口相关联。我不会考虑安全地复制这个套接字,除非你 100% 确定没有其他代码试图将它与第二个 I/O 完成端口相关联;我知道 2.0 .NET Socket 类确实在内部使用 IOCP 进行异步操作,尽管在以后的版本中可能已经改变了。
【解决方案2】:

您可能可以使用WSADuplicateSocket() 返回的PROTOCOL_INFO 结构,将其转换为等效的SocketInformation,然后使用appropriate socket constructor 获取具有不同句柄的共享套接字。

WSADuplicateSocket() 文档中的“备注”部分描述了套接字复制中涉及的常用控制流程。我认为这个流程有点相当于SocketInformation Socket::DuplicateAndClose()Socket(SocketInformation) 对调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2011-12-05
    • 2012-11-10
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多