バックグラウンド
net.tcp ポート 667 でリッスンする .net 4.0 WCF アプリケーションがあります。 (Windows 7 マシン)
ある時点で、アプリケーションが異常終了します (たとえば、ユーザーがプロセスを強制終了します)。
ここで奇妙なことが起こります。ポートは開いたままです。ユーザーがアプリケーションを再起動すると、そのポートは既に使用されているため、リッスンできません。
奇妙なことに、所有しているプロセスが強制終了されたにもかかわらず、OS は数時間経ってもポートを閉じません。
ここにいくつかの観察があります:
- TcpView では、プロセスは
<non-existent>
、PID は古い (強制終了された) プロセスに属し、状態はLISTENING
です。ローカル アドレスは私のマシンで、そのポートにはIPV4
とIPV6
リスナーの両方があります。 - TcpView での「接続を閉じる」操作と「プロセスを終了する」操作は、そのポートには影響しません。
- Process Explorer には、古い (強制終了された) プロセスは表示されません。PID またはポートのハンドルを検索しようとしましたが、何も見つかりませんでした。
- 関連する実行可能ファイルを実行する と、ローカル アドレスは と
netstat -a -b -n -o
表示されます。その他の情報は TcpView と同じです。System
0.0.0.0
そのポートを閉じる唯一の方法は、システムの再起動でした...
質問
- プロセスが不当に存在した後に長引くことを避けるために、WCF net.tcp Service Host リスナーを構成する方法はありますか?
- そのポートをプログラムで閉じる方法はありますか? 存在する場合、アプリケーションはリッスンする前にまずそのポートを閉じることができます。
- そのような「デーモン」ポートを閉じることができるユーティリティはありますか? (TcpView ではそれができないため)
- これはOSのバグですか?OS はそのような「デーモン」リスナーを追跡し、プロセスが存在するとそれらを閉じるべきではありませんか?