当所有者进程已被终止时关闭TCP连接

时间:2013-05-24 08:36:06

标签: c# wcf networking tcp

我有一个Windows服务 - 启动时 - 打开一些WCF服务来监听8000端口。碰巧这项服务有时会崩溃。如果是这样,TCP连接不会被释放,因此如果我再次尝试启动它,会导致我的服务抛出异常:

  

AddressAlreadyInUseException:IP端点上已有一个侦听器0.0.0.0:8000

一些观察结果:

  • 运行CurrPortsnetstat -ano时,我可以看到8000端口仍在使用(处于LISTENING状态)并且由进程ID {{1对应于我的服务进程ID。但我的服务已经崩溃,并且不再出现在任务管理器中。因此,我无法杀死释放端口的过程!当然,运行XXX会返回:

      

    错误:找不到“XXX”进程。

  • 运行CurrPortstaskkill /PID XXX时,我可以看到创建侦听端口所涉及的进程名称为netstat -b,而不是System(而当我的服务正在运行时,它是MyService.exe

  • 我尝试使用CurrPorts关闭连接,但我总是收到以下错误消息:

      

    无法关闭一个或多个TCP连接。请注意,您必须以管理员身份运行此工具才能关闭TCP连接。

    CurrPorts Screenshot

    (无话可说,我以管理员身份运行CurrPorts ...)

  • TCPView也没有多大帮助:与8000端口关联的进程名称为MyService.exe,执行“结束进程”或“关闭连接”无效。

  • 我尝试使用Process Explorer查看是否没有与PID <non-existent>关联的子进程,但这里没有运气。

  • 如果我正确关闭服务(崩溃之前),则正确释放TCP连接。这是正常的,因为我在服务的XXX事件中关闭了WCF服务主机。


我发现释放连接的唯一方法是重启服务器(这在生产环境中不方便,你可以猜到)。等待没有帮助,TCP连接永远不会释放。

如何在不重新启动Windows服务器的情况下关闭连接?


PS:发现some questions与我的非常相似。

2 个答案:

答案 0 :(得分:0)

我建议你尝试socket.ExclusiveAddressUse = false; 虽然通常不打算解决这种问题。

另一种解决方法 - 找到其他服务进程并在您的第一个代码行中手动终止它。

答案 1 :(得分:0)

我遇到了同样的问题,并最终发现该端口由我的进程推出的子进程保持打开状态。不知道为什么没有一个系统工具可以告诉我。结束子进程可以释放端口。