0

サーバーへの tcp 接続を確立した後、Linuxアプリケーションを閉じると、Socket.close() が呼び出されます。

netstat -pant を確認すると、接続が TIME_WAIT ステータスになっていることがわかります。

これにより、同じポートを使用して接続しているため、サーバーにすぐに接続できなくなります。代わりに、再接続する前に、接続が TIME_WAIT ステータスでタイムアウトになるのを待つ必要があります。

set_so_timeout()、set_keepalive()、set_so_linger()、および set_reuseaddr() というソケット メソッドを試してみましたが、この投稿ではメソッドの正確なスペルが間違っている可能性があります。

私の質問は、接続を TIME_WAIT ステータスから抜け出させて、すぐに再び接続できるようにするにはどうすればよいですか?

私にお知らせください。

ありがとう、ジブ

4

1 に答える 1

6

接続を TIME_WAIT から解放する最善の方法は (驚くべきことに) 待つことです:-)

それが TCP/IP のしくみです。セッションはタプルによって識別され、(sourceIP, sourcePort, destIP, destPort, protocol)それを再利用できない理由は、ネットワークのどこかにまだパケットがある可能性があるためです。

TIME_WAIT 状態は通常、最大パケット寿命の 2 倍であり、それをいじる必要はありません。これは、前のセッションからパケットが表示される可能性があるためです (これにより、現在のセッションが台無しになります)。

理想的には、別のソース ポートから接続する必要があります。そうすれば、すぐにセッションを開くことができます。

もう 1 つ気をつけなければならないのは、ひどくクローズドなセッションです。私は常に、クライアントがセッションをシャットダウンする (そして完全にシャットダウンする) べきであるというガイドラインに同意してきました。これにより、長寿命のハーフクローズド セッションがぶらぶらする可能性が最小限に抑えられます。

于 2009-09-29T01:55:30.937 に答える