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

时间:2011-01-05 13:02:25

标签: c# .net sockets winsock

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

上述程序在Windows上运行,但是我更喜欢不涉及P / Invoke的.NET部分的解决方案。作为旁注,从父母到子女过程的沟通不是问题,因此我可以轻松地在两者之间共享数据 此外,一旦我开始使用本机进程中的套接字,我就不再需要在.NET进程中使用它了,并且.NET进程 在我使用完插槽之前终止非托管进程,因此连同解决方案我需要知道如何处理.NET中的Socket对象,以便它的处理不会影响操作系统套接字及其可用性。

提前致谢!

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

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