我有一个Windows服务 - 启动时 - 打开一些WCF服务来监听8000端口。碰巧这项服务有时会崩溃。如果是这样,TCP连接不会被释放,因此如果我再次尝试启动它,会导致我的服务抛出异常:
AddressAlreadyInUseException:IP端点上已有一个侦听器0.0.0.0:8000
一些观察结果:
运行CurrPorts或netstat -ano
时,我可以看到8000端口仍在使用(处于LISTENING
状态)并且由进程ID {{1对应于我的服务进程ID。但我的服务已经崩溃,并且不再出现在任务管理器中。因此,我无法杀死释放端口的过程!当然,运行XXX
会返回:
错误:找不到“XXX”进程。
运行CurrPorts或taskkill /PID XXX
时,我可以看到创建侦听端口所涉及的进程名称为netstat -b
,而不是System
(而当我的服务正在运行时,它是MyService.exe
。
我尝试使用CurrPorts关闭连接,但我总是收到以下错误消息:
无法关闭一个或多个TCP连接。请注意,您必须以管理员身份运行此工具才能关闭TCP连接。
(无话可说,我做以管理员身份运行CurrPorts ...)
TCPView也没有多大帮助:与8000端口关联的进程名称为MyService.exe
,执行“结束进程”或“关闭连接”无效。
我尝试使用Process Explorer查看是否没有与PID <non-existent>
关联的子进程,但这里没有运气。
如果我正确关闭服务(崩溃之前),则正确释放TCP连接。这是正常的,因为我在服务的XXX
事件中关闭了WCF服务主机。
我发现释放连接的唯一方法是重启服务器(这在生产环境中不方便,你可以猜到)。等待没有帮助,TCP连接永远不会释放。
如何在不重新启动Windows服务器的情况下关闭连接?
答案 0 :(得分:0)
我建议你尝试socket.ExclusiveAddressUse = false; 虽然通常不打算解决这种问题。
另一种解决方法 - 找到其他服务进程并在您的第一个代码行中手动终止它。
答案 1 :(得分:0)
我遇到了同样的问题,并最终发现该端口由我的进程推出的子进程保持打开状态。不知道为什么没有一个系统工具可以告诉我。结束子进程可以释放端口。