- - PR -
CONNECTのタイムアウト設定について(Socket)
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-09-05 01:42
かいです。
Socketを使用するプログラムで、connectのタイムアウト を設定したいのですが、うまくいきません。 (相手先がいない時、エラーをすぐに検出する) 設定間違いや漏れをご教授ください。 private Socket targetSocket_ ; InetSocketAddress endpoint= new InetSocketAddress(InetAddress.getByName(host01), 2XXX); targetSocket_ = new Socket() ; targetSocket_.connect(endpoint, 30000) ; <環境> OS:Windows2000 JDK:1.4.2 よろしくお願いします。 [ メッセージ編集済み 編集者: かい 編集日時 2004-09-05 01:50 ] | ||||
|
投稿日時: 2004-09-05 12:58
利用したことないのでわかりませんが、、、、。
どのようにうまくいかないのでしょうか? | ||||
|
投稿日時: 2004-09-05 19:42
かいです。
返信、ありがとうございます。 また、説明不足ですみません。 自分が、実現したいのは、connectを行った時、 相手が動作していない場合でも一定時間、 connectのリトライして欲しいと思っています。 JDK1.4では、対応していると思っています。 記載したソースでは、相手がaccept待ち状態では無い 場合に、すぐに、エラーで戻ってきてしまいます。 (ソースには、30秒間、リトライさせようと思って いるつもりです) 相手が、acceptしていれば、つながります。 よろしくお願いします。 | ||||
|
投稿日時: 2004-09-05 21:25
connect メソッドは長時間のリトライはしないようです。
(以前WindowsXP SP1 + J2SDK 1.4.2_04 で調べたときは、TCPレベルで15.6ms程度の 間に3回だけリトライしてました。この動作はJavaが行っているかどうか 判りません。WindowsのTCP/IPプロトコルスタックが行っているのかも) 以下は推測です: connect メソッドは相手が拒否しているのであれば、即座に 「java.net.ConnectException: Connection refused: connect」 で返ってくるはずです。 (TCPレベルで、クライアントからの SYN セグメントに対して、 サーバが RST セグメントを返しているはず) で、もしこの Exception が発生していた場合、相手が接続を拒否しているわけです から、connect メソッドに(長時間の)リトライ機能があったとしても、リトライ しても意味がありません。 相手が拒否しない用になるには、サーバの設定を変える、 パケットフィルタの設定を変える、などしないとならないわけですから、 30秒間リトライしたとしても、期間中に接続が成功する可能性は少ないでしょう。 それに、もし connect にリトライ機能が合ったとしたら、リトライ間隔か リトライ回数を設定できないとまずいでしょう。 ということで、もし「java.net.ConnectException: Connection refused: connect」が 発生しているのであれば、自前でリトライする必要があります。 もっとも、この場合はリトライしたところで接続が成功するとは思えません。 | ||||
|
投稿日時: 2004-09-05 23:16
かいです。
ちいにぃさん、丁寧な返信ありがとうございます。
考えてみれば、ちいにぃさんの言う通り、リトライ間隔や回数を 設定できないのは、おかしいですね。 APIを調べた時に、 「指定されたタイムアウト値を使用して....接続します」 と書いてあったのと、JDK1.4から導入ということで、 リトライの仕組みを自作しなくてよいと思い、使おうと 思いました。 リトライは、accept側が、connectする側より、遅く準備 完了になった時に、指定する時間までは、システム側で トライしようと思ったからです。 (ユーザの操作を少なくなればよいかなと思った次第です) どうもありがとうございました。 | ||||
1
