6

バックグラウンド

net.tcp ポート 667 でリッスンする .net 4.0 WCF アプリケーションがあります。 (Windows 7 マシン)
ある時点で、アプリケーションが異常終了します (たとえば、ユーザーがプロセスを強制終了します)。
ここで奇妙なことが起こります。ポートは開いたままです。ユーザーがアプリケーションを再起動すると、そのポートは既に使用されているため、リッスンできません。

奇妙なことに、所有しているプロセスが強制終了されたにもかかわらず、OS は数時間経ってもポートを閉じません。

ここにいくつかの観察があります:

  • TcpView では、プロセスは<non-existent>、PID は古い (強制終了された) プロセスに属し、状態はLISTENINGです。ローカル アドレスは私のマシンで、そのポートにはIPV4IPV6リスナーの両方があります。
  • TcpView での「接続を閉じる」操作と「プロセスを終了する」操作は、そのポートには影響しません。
  • Process Explorer には、古い (強制終了された) プロセスは表示されません。PID またはポートのハンドルを検索しようとしましたが、何も見つかりませんでした。
  • 関連する実行可能ファイルを実行する と、ローカル アドレスは とnetstat -a -b -n -o表示されます。その他の情報は TcpView と同じです。System0.0.0.0

そのポートを閉じる唯一の方法は、システムの再起動でした...

質問

  1. プロセスが不当に存在した後に長引くことを避けるために、WCF net.tcp Service Host リスナーを構成する方法はありますか?
  2. そのポートをプログラムで閉じる方法はありますか? 存在する場合、アプリケーションはリッスンする前にまずそのポートを閉じることができます。
  3. そのような「デーモン」ポートを閉じることができるユーティリティはありますか? (TcpView ではそれができないため)
  4. これはOSのバグですか?OS はそのような「デーモン」リスナーを追跡し、プロセスが存在するとそれらを閉じるべきではありませんか?
4

2 に答える 2

2

プロセスが不当に存在した後に長引くことを避けるために、WCF net.tcp Service Host リスナーを構成する方法はありますか?

いいえ、少なくとも使用する必要はありませんが、再起動時にソケットアドレスを再利用するように指示する方法があり、それが不要になります。

そのポートをプログラムで閉じる方法はありますか? 存在する場合、アプリケーションはリッスンする前にまずそのポートを閉じることができます。

いいえ。ポートを開いたアプリケーションのみがポートを閉じることができます。

そのような「デーモン」ポートを閉じることができるユーティリティはありますか? (TcpView ではそれができないため)

いいえ、上記を参照してください。

これはOSのバグですか?OS はそのような「デーモン」リスナーを追跡し、プロセスが存在するとそれらを閉じるべきではありませんか?

プロセスの終了時に、TCP ポートを含むプロセスのすべてのリソースを解放する必要があります。TCP 'ESTABLISHED' ポートの場合は例外で、TCP のセキュリティ上の理由から数分間ハングアップします。

まだアクティブなソケットを継承したサブプロセスがあるようです。

于 2012-09-11T09:44:52.350 に答える
0

It happened to me as well, and actually, I found it is those sub-processes that holding the port. My solution is use Process Explorer to search for the Non-existing PID, and kill all the processes list, then the port will be free.

于 2013-01-17T01:15:42.237 に答える