我怎样才能使一个“守护” TCP端口监听后,其拥有的进程退出?(How can I free a “

2019-06-28 04:14发布

背景

我有一个.NET 4.0 WCF的应用程序,Net.Tcp端口667(Windows 7计算机)上侦听
在某些点上的应用程序退出非正常(用户杀死的过程中,例如)。
现在,一件奇怪的事情发生了: 该端口保持打开状态 。 当用户重新启动应用程序,它不能在该端口上侦听,因为它是已在使用。

奇怪的是,即使拥有的进程被杀死,操作系统不关闭端口,甚至没有几个小时后。

这里有一些意见:

  • 上的TCPView过程是<non-existent> ,该PID属于旧的(杀死的)处理,并且状态被LISTENING 。 本地地址是我的机器,那里不仅有IPV4IPV6在该端口上监听。
  • “关闭连接”和套装软件“结束进程”操作具有该端口上没有影响。
  • 过程管理器不显示旧的(杀死的)过程。 我试图寻找手柄的PID或端口,但一无所获。
  • 当运行netstat -a -b -n -o参与显示为可执行文件System和本地地址为0.0.0.0 。 其他信息是一样的套装软件。

我发现,关闭该端口的唯一方法是在系统重新启动...

问题

  1. 有没有配置WCF的net.tcp服务主机监听器,以避免挥之不去的过程中存在非正常后一种方式?
  2. 有没有一种方法以编程方式关闭该端口? 如果有,我的应用程序可以先试着听它之前关闭该端口。
  3. 有没有一种实用工具,可以关闭这样的“守护”的端口? (因为套装软件不能做到这一点)
  4. 这是一个OS错误? 如果不是OS跟踪这样的“守护”的听众,一旦过程中存在关闭它们?

Answer 1:

有没有配置WCF的net.tcp服务主机监听器,以避免挥之不去的过程中存在非正常后一种方式?

没有,至少没有,你应该使用,但有一种方式告诉它,当它重新启动,这使得不必要的重复使用套接字地址。

有没有一种方法以编程方式关闭该端口? 如果有,我的应用程序可以先试着听它之前关闭该端口。

号只有开了一个端口的应用程序可以将其关闭。

有没有一种实用工具,可以关闭这样的“守护”的端口? (因为套装软件不能做到这一点)

不,见上面。

这是一个OS错误? 如果不是OS跟踪这样的“守护”的听众,一旦过程中存在关闭它们?

当处理退出所有进程的资源,包括TCP端口应该relased。 有一个在TCP“立”端口,流连于TCP安全原因,一两分钟的情况下例外。

这听起来像有一子的过程,继承仍处于活动状态的插座。



Answer 2:

它发生在我为好,实际上,我发现它是持有那些端口子过程。 我的解决办法是使用Process Explorer来搜索不存在的PID,并杀死所有的进程列表,则该端口将是免费的。



文章来源: How can I free a “daemon” TCP port listener, after its owning process exited?
标签: wcf tcp