再利用アドレスが true に設定されている場合でも、TCP ソケットが「java.net.BindException: Address already in use」をスローする原因は何ですか? これは、アプリケーションがすぐに再起動された場合にのみ発生します。CentOS 5 Linux OS で実行されます。
3 に答える
これはちょっと説明します:
http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html#bind
サーバーを再実行しようとすると、bind() が失敗し、「アドレスは既に使用されています」と表示されることがあります。どういう意味ですか?接続されていたソケットの一部がまだカーネル内に残っており、ポートを占有しています。クリアされるのを待つか(1分ほど)、次のようにポートを再利用できるようにプログラムにコードを追加できます。
(Cコードを提供)
基本的に、C では、setsockopt() という関数を呼び出します。パラメータの 1 つは SO_REUSEADDR と呼ばれ、そのポートを再利用できます。
Javaで同等のオプションを設定する方法を理解するための簡単なリンクをGoogleで見つけました:
http://java.sun.com/j2se/1.4.2/docs/guide/net/socketOpt.html
http://java.sun.com/j2se/1.4.2/docs/api/java/net/SocketOptions.html
あなたの言うことが正しければ、この例外をループでトラップし、数秒後に再試行できるはずです。(これを行う必要はありませんが、CentOS についていくつか奇妙なことを聞いたことがあります)
Java Bind Exception は、ポートまたは InetAddress のいずれかが既に使用されていて、もう一度使用したい場合に発生します。したがって、ポートを解放して、実行中の場合はプログラムを停止します。それ以外の場合はポートを変更します
ありがとうディーパック