0

Javaでのjbuのバインドエラーと非常によく似た問題があります。

違いは、サーバーがストリームを開いて1日中接続を受け入れることです。次に、午前中にサービスをハードキルし、10秒待ってから、サービスを再起動して接続を受け入れるスクリプトがあります。ほとんどの場合は機能しますが、起動しようとすると、サービスでBindExceptionsが発生する場合があります。外部スクリプトによって強制終了される前にプログラム内のストリームを閉じる良い方法を考えることができないので、外部で、または私がサービスがそれ自体を強制終了するように設計を再設計する必要がありますが、そうする前にすべての接続が閉じられていることを確認してください。(マシン上でWindows Server 2008を実行しています。)

4

1 に答える 1

1

TCP接続が閉じられると、接続が閉じられた後、接続が一定期間タイムアウト状態のままになる場合があります(通常はTIME_WAIT状態または2MSL待機状態と呼ばれます)。既知のソケットアドレスまたはポートを使用するアプリケーションの場合、ソケットアドレスまたはポートに関連するタイムアウト状態の接続があると、必要なSocketAddressにソケットをバインドできない場合があります。
そのため、10秒間待機していても、サービスでBindExceptionsが発生することがあります。

bind(SocketAddress)を使用してソケットをバインドする前にSO_REUSEADDRを有効にすると、前の接続がタイムアウト状態であっても、ソケットをバインドできます。これは、次を使用して実現できます。

ソケットをバインドする前 のServerSocket.setReuseAddress(true) 。
これにより、OSがすでにバインドされていると表示されている場合でも、同じアドレスを再利用するように強制または伝達されます...

于 2013-02-28T16:48:01.790 に答える