c# - 当所有者进程已经被杀死时关闭 TCP 连接

标签 c# wcf networking tcp

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

AddressAlreadyInUseException: There is already a listener on IP endpoint 0.0.0.0:8000

一些观察:

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

    ERROR: The process "XXX" not found.

  • 运行时CurrPortsnetstat -b ,可以看到创建监听端口涉及的进程名是System , 而不是 MyService.exe (而当我的服务正在运行时它是 MyService.exe)。

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

    Failed to close one or more TCP connections. Be aware that you must run this tool as admin in order to close TCP connections.

    CurrPorts Screenshot

    (不用说,我确实以管理员身份运行 CurrPorts...)

  • TCPView也没有太大帮助:与 8000 端口关联的进程名称是 <non-existent> ,并且执行“结束进程”或“关闭连接”没有任何效果。

  • 我试图查看是否没有与 PID XXX 关联的子进程使用 Process Explorer ,但这里没有运气。

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


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

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


附言:发现some questions和我的非常相似。

最佳答案

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

关于c# - 当所有者进程已经被杀死时关闭 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16730776/

相关文章:

c# - Microsoft OData 无法仅在 $filter (v7) 中使用日期

c# - LINQ 中从何处选择的顺序已更改?是什么原因?

c# - CRL 无法通过 http 代理工作

.net - 基于 WCF 的 SOA、分布式和服务器端编程的好书?

c# - 如何在 NetworkManager (Unity C#) 中设置客户端 GameObject 的变量?

C# 8.0 对多维数组使用 Range

c# - 测试多个标志值

c# - 无法在 IIS 中正确承载 WCF 服务。错误 404

sockets - 冲洗 socket 是什么意思?

networking - DVR是否使用标准协议(protocol)进行流传输?