从.NET传递套接字句柄到非托管子进程

6
我目前有一个.NET程序,它会连接到服务器并启动另一个非托管可执行文件。本机进程应接管同一套接字(不关闭连接至子进程终止是至关重要的!),并通过该套接字开始与服务器通信。
上述程序均在Windows上运行,但我希望找到一个不涉及.NET部分的P/Invoke解决方案。顺便提一下,从父进程到子进程的通信不是问题,因此我可以轻松地在两者之间共享数据。
此外,一旦我开始使用本机进程的套接字,我就不再需要从.NET进程中使用它,而且.NET进程将在我完成使用非托管进程的套接字之前终止。因此,除了解决方案之外,我还需要知道在.NET中如何处理Socket对象,以使其处理不影响操作系统套接字及其可用性。
谢谢您的帮助!

2
请查看此处的示例 套接字复制 - 第2部分 - lsalamon
2个回答

4

.NET 2.0及以上版本为我们提供了方便的方法DuplicateAndClose

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

此外,还有一种很好的非托管复制套接字的方式,在这里描述


Mayevski 'EldoS:MSDN说:“目标进程应使用Socket创建重复的套接字实例。” 对于非托管进程,我认为这是不可能的。 - ali_bahoo
@sad_man 你说得对。我已经在更新中加入了另一个选项。 - Eugene Mayevski 'Callback
谢谢指向DuplicateAndClose。我最终使用P/Invoke调用WSADuplicateSocket编写了一些非常肮脏的代码,但看起来它现在可以解决问题 :) - em70
我还要补充一点,我注意到当第一个进程(一个.NET进程)终止时,它会关闭套接字,无论我是否进行了复制,因此我必须先释放所有其他资源,然后才能终止进程,以防止套接字被关闭。非常不好,但我仍然没有找到替代方法。 - em70
@emaster,你是如何进行复制和套接字关闭的? - Eugene Mayevski 'Callback

0

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


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