父进程死亡后由子进程保留的TCP端口(.net 3.5)

时间:2011-04-28 12:39:16

标签: .net wcf process tcp

我在.net 3.5中实现了一个小WCF服务,客户端通过端口4321上的TCP连接。此服务可以产生其他进程(通过System.Diagnostics.Process)。当然,当服务被杀或崩溃或其他什么时,产生的进程仍然存在。我遇到的问题是如果我尝试在这些进程仍然运行时重新启动服务,我会得到以下异常:

  

CommunicationException:有   已经是IP端点上的监听器   0.0.0.0:4321。确保您没有尝试使用此终点   多次在您的应用程序和   没有其他应用程序   听这个端点。

的确,当我运行netstat时,我可以看到有一个进程侦听端口TCP 4321:

  

TCP 0.0.0.0:4321 MTL-WKS-AG196:0 Listninging 97308

你在这里看到的进程ID(97308)是我第一次启动的服务之一(它不再存在,因为它被杀死了)。 释放端口的唯一方法是终止在服务生命周期中生成的所有进程。

我对端口和进程知之甚少,但我的理解是子进程“继承”父进程监听的端口。是或多或少会发生什么?

有没有办法取消这种行为?无法访问衍生过程的代码?

另外,我真的不认为这是可能的,但有没有办法告诉Windows在父进程被杀时杀死子进程?

谢谢!

1 个答案:

答案 0 :(得分:1)

显然BCL允许所有句柄由子进程继承(在本例中为端口) 见Stephen Cleary response on MSDN Forum

我目前正遇到类似问题,并使用临时解决方法。我启用了Net.Tcp端口共享服务并启用了wcf服务app.config。 (更多信息here

当我得到时间时,将寻求将斯蒂芬的建议作为一个更永久的解决方案实施:)