背景
我有一个 .net 4.0 WCF 应用程序,它在 net.tcp 端口 667 上侦听。(Windows 7 机器)
有时应用程序不正常退出(例如,用户终止了进程)。
现在发生了一件奇怪的事情:端口保持打开状态。当用户重新启动应用程序时,它无法侦听该端口,因为它已经在使用中。
奇怪的是,即使拥有进程被杀死,操作系统也没有关闭端口,即使在几个小时后也没有。
以下是一些观察:
- 在 TcpView 上,进程为
<non-existent>
,PID 属于旧(已杀死)进程,状态为LISTENING
。IPV4
本地地址是我的机器,并且在该端口上有两个IPV6
监听器。 - TcpView 上的“关闭连接”和“结束进程”操作对该端口没有影响。
- Process Explorer 不显示旧的(已终止的)进程。我试图搜索 PID 或端口的句柄,但一无所获。
- 运行时
netstat -a -b -n -o
涉及的可执行文件显示为System
,本地地址为0.0.0.0
。其他信息与 TcpView 相同。
我发现关闭该端口的唯一方法是重新启动系统......
问题
- 有没有办法配置 WCF net.tcp 服务主机侦听器以避免在进程不正常存在后挥之不去?
- 有没有办法以编程方式关闭该端口?如果有,我的应用程序可以先关闭该端口,然后再尝试收听它。
- 是否有可以关闭此类“守护程序”端口的实用程序?(因为 TcpView 不能这样做)
- 这是操作系统错误吗?操作系统不应该跟踪此类“守护程序”侦听器并在进程存在后关闭它们吗?