- PR -

CONNECTのタイムアウト設定について(Socket)

1
投稿者投稿内容
かい
常連さん
会議室デビュー日: 2003/05/27
投稿数: 34
投稿日時: 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/08/04
投稿数: 112
投稿日時: 2004-09-05 12:58
利用したことないのでわかりませんが、、、、。
どのようにうまくいかないのでしょうか?
かい
常連さん
会議室デビュー日: 2003/05/27
投稿数: 34
投稿日時: 2004-09-05 19:42
かいです。

返信、ありがとうございます。
また、説明不足ですみません。

自分が、実現したいのは、connectを行った時、
相手が動作していない場合でも一定時間、
connectのリトライして欲しいと思っています。
JDK1.4では、対応していると思っています。

記載したソースでは、相手がaccept待ち状態では無い
場合に、すぐに、エラーで戻ってきてしまいます。
(ソースには、30秒間、リトライさせようと思って
 いるつもりです)
相手が、acceptしていれば、つながります。

よろしくお願いします。

ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 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」が
発生しているのであれば、自前でリトライする必要があります。
もっとも、この場合はリトライしたところで接続が成功するとは思えません。
かい
常連さん
会議室デビュー日: 2003/05/27
投稿数: 34
投稿日時: 2004-09-05 23:16
かいです。

ちいにぃさん、丁寧な返信ありがとうございます。

引用:

それに、もし connect にリトライ機能が合ったとしたら、リトライ間隔か
リトライ回数を設定できないとまずいでしょう。

ということで、もし「java.net.ConnectException: Connection refused: connect」が
発生しているのであれば、自前でリトライする必要があります。
もっとも、この場合はリトライしたところで接続が成功するとは思えません。



考えてみれば、ちいにぃさんの言う通り、リトライ間隔や回数を
設定できないのは、おかしいですね。

APIを調べた時に、
「指定されたタイムアウト値を使用して....接続します」
と書いてあったのと、JDK1.4から導入ということで、
リトライの仕組みを自作しなくてよいと思い、使おうと
思いました。

リトライは、accept側が、connectする側より、遅く準備
完了になった時に、指定する時間までは、システム側で
トライしようと思ったからです。
(ユーザの操作を少なくなればよいかなと思った次第です)

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)