【问题标题】:TCP port reserved by child process after parent process died (.net 3.5)父进程死亡后子进程保留的 TCP 端口(.net 3.5)
【发布时间】:2011-08-14 16:38:05
【问题描述】:

我在 .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 监听 97308

您在此处看到的进程 ID (97308) 是我第一次启动的服务之一(它应该不再存在,因为它已被杀死)。 释放端口的唯一方法是杀死在服务生命周期内产生的所有进程。

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

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

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

谢谢!

【问题讨论】:

    标签: .net wcf process tcp


    【解决方案1】:

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

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

    当我有时间时,我会寻求实施斯蒂芬的建议作为更永久的解决方案:)

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2014-06-19
      • 2013-04-16
      • 1970-01-01
      相关资源
      最近更新 更多