【问题标题】:Pass socket handle from .NET to unmanaged child process将套接字句柄从 .NET 传递给非托管子进程
【发布时间】:2011-01-05 13:02:24
【问题描述】:

我目前有一个 .NET 程序启动与服务器的连接并启动另一个非托管可执行文件。本机进程应该接管同一个套接字(在子进程终止之前不要关闭连接是必不可少的!)并开始通过它与服务器进行通信。

上述程序都在 Windows 上运行,但是我更喜欢不涉及 .NET 部分的 P/Invoke 的解决方案。附带说明一下,从父进程到子进程的通信不是问题,因此我可以轻松地在两者之间共享数据。
此外,一旦我开始使用本机进程中的套接字,我就不再需要从 .NET 进程中使用它,并且 .NET 进程 在我完成使用来自非托管进程,因此除了解决方案之外,我还需要知道如何处理 .NET 中的 Socket 对象,以便其处理不会影响 OS 套接字及其可用性。

提前致谢!

【问题讨论】:

标签: c# .net sockets winsock


【解决方案1】:

.NET 2.0 及更高版本提供方便的方法DuplicateAndClose

更新: 看起来需要破解才能找出目标套接字在 SocketInformation.ProtocolInformation 中的存储位置(在哪个偏移处)。这可以通过在源进程中捕获字节数组,然后在另一个 .NET 进程中重新创建一个套接字并在那里(在第二个进程中)获取套接字句柄来完成。然后查看数据在字节数组中的位置。

还有一种很好的非托管方式来复制套接字,described here

【讨论】:

  • Mayevski 'EldoS : MSDN 说:The target process should use Socket to create the duplicate socket instance. 对于非托管进程,我认为这是不可能的。
  • @sad_man 你是对的。我在更新中添加了一个选项。
  • 感谢您将我指向 DuplicateAndClose。我最终使用 P/Invoke 调用 WSADuplicateSocket 编写了一些非常肮脏的代码,但现在看起来它可以解决问题:)
  • 我还要补充一点,我注意到当第一个进程(作为 .NET 进程)终止时,无论我是否进行了复制,它都会关闭套接字,所以我必须首先释放所有其他资源,然后 TerminateProcess 使套接字无法关闭。很脏,但我还没有找到替代品。
  • @emaster 你是怎么做复制和套接字关闭的?
【解决方案2】:

我认为 .NET Socket 类创建的套接字句柄默认是可继承的。 IIRC 如果您使用Process.StartProcessStartInfo.UseShellExecute = false 生成子进程(ShellExecute 不允许句柄继承),那么您的子进程应该已经继承了套接字句柄。您是否尝试简单地将 Socket.Handle 传递给子进程并在那里使用它?而且我认为只要子进程拥有继承的句柄,套接字就会保持打开状态,即使在创建它的进程消失之后也是如此。 (我从来没有直接使用过这个,但是我曾经遇到过一个由这种行为引起的错误。)但是,套接字可能已经用 FILE_FLAG_OVERLAPPED 等标志打开了,你必须使用正确的函数组合来访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多