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

7
我在.NET 3.5中实现了一个小型的WCF服务,客户端通过TCP在4321号端口连接该服务。该服务可以通过System.Diagnostics.Process派生其他进程。当然,当服务被杀死、崩溃或其他情况时,生成的进程将会继续运行。我遇到的问题是,如果我尝试在这些进程仍在运行时重新启动服务,我会得到以下异常:

CommunicationException: IP端点0.0.0.0:4321上已经有一个侦听器。请确保您没有在应用程序中多次使用此端点,并且没有其他应用程序正在侦听此端点。

事实上,当我运行netstat时,可以看到有一个进程正在监听TCP 4321端口:

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

这里看到的进程ID(97308)是我最初启动的服务的进程ID(它不应该再存在,因为它已被杀死)。唯一释放该端口的方法是杀死服务期间生成的所有进程。

我对端口和进程知之甚少,但我的理解是子进程“继承”父进程所监听的端口。这是否与实际情况相符?

有没有一种方法可以取消这种行为?而不需要访问生成进程的代码?

此外,我认为这似乎不可能,但是否有办法告诉Windows在父进程被杀死时终止子进程?

谢谢!

1个回答

2

显然,BCL允许所有句柄被子进程(在这种情况下是端口)继承。请参见MSDN论坛上Stephen Cleary的回复

我目前遇到了类似的问题,并使用临时解决方法解决了这个问题。我启用了Net.Tcp Port Sharing服务并在wcf服务app.config中启用它。(更多信息在这里

当我有时间时,将寻求实施Stephen的建议作为更持久的解决方案 :)


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