ClientSocketでタイムアウトをでなくするには?


  2005-02-03 01:31:03  No: 13013

TClientSocketを使ってクライアントプログラムを作成しているのですが、
初歩的なことで困ってます。

接続できない相手に対してOpenで接続を開始すると、30秒くらいしてから
OnErrorイベントが発生しタイムアウトエラーになります。
ここまではよいのですが、
Openして、OnErrorイベントが発生する前にCloseで切断しても
30秒くらいするとOnErrorイベントが発生しタイムアウトエラーに
なってしまします。

このタイムアウトエラーをでないようにする方法はあるのでしょうか?
また、タイムアウトの時間は設定できるのでしょうか?


  2005-02-05 20:35:46  No: 13014

>30秒くらいするとOnErrorイベントが発生しタイムアウトエラーになって...
>このタイムアウトエラーをでないようにする方法はあるのでしょうか?

ErrorCodeを 0 にしては?

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  // ErrorCodeを0にすると ESocketError例外は生成されない
  ErrorCode := 0;
end;


  2005-02-07 18:07:19  No: 13015

そうですね。
たしかにError1Codeを0にすれば例外は生成されないですね。

説明が足らなくて申し訳ありません。
私のやりたいことは、Openにて接続を開始して、実際にタイムアウトと
なった場合はエラーを表示し、途中でCloseにて接続を中断した場合
タイムアウトエラーを表示させたくないということです。

そこで現在OnErrorイベントの中で以下の処理を行っております。

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  if ErrorEvent = eeConnect then  // 接続エラー??
  begin
    ShowMessage('接続エラー発生'); // 接続異常発生
  end;
  ErrorCode := 0;
end;

しかし、このままでは途中でCloseしたのにもかかわらず
OnErrorイベント処理にとんでくるため接続エラーが表示されて
しまいます。
なんとか中断した場合にこの処理にすらとんでこないようにする方法
がないかと考えております。

それとも、以下のような接続状態フラグを作ってソフトの中で論理的に
管理し、OnErrorイベント処理の中でフラグが0のときはエラー表示をせず
ErrorCodeに0を入れるだけにする。といった方法も考えてます。
この方法ならやりたいことは実現できると思うのですが管理がややこしくなる
ためなんとか前記の方法(OnErrorイベント処理にとんでこなくする方法)で
実現したいです。
<接続状態フラグ>
  接続開始:1
  接続終了:0
  接続中断:0

よろしくお願いします。


Delφ初心者  2005-03-12 20:25:25  No: 13016

初カキコです。

すんごいしょぼい事なんですが、OnErrorイベントのダイアログを表示する所、適当なBoolean型の変数を比較して発生させるようにすればイイんじゃないんでしょうか。

接続ボタンを押すとその変数をTrueに、
切断ボタンを押すとその変数をFalseにする、みたいな感じで。

何か分かりにくい説明ですいません。


  2005-03-19 02:00:55  No: 13017

Delφ初心者さんありがとうございます。
説明はよくわかりました。

1対1で行うなら単純にDelφ初心者さんのいうやり方で
できますね。

またまた説明不足で申し訳ありません。
私の作成しているアプリがクライアントで、複数のサーバーに接続したいのです。
つまり1対多ということになります。

あらためて私のやりたいことは
①接続できない相手に対してOpen
②タイムアウトエラーのでる前にClose
③接続できる相手に対してOpen
④接続完了
⑤①で接続しにいった相手のタイムアウトエラー表示

となってしまいます。
⑤のところでエラー表示をさせたくないのです。

そのために、
OnErrorイベント処理にとんで来ない方法はないものかと考えています。
やはりソフト的に変数をもって管理するしかないでしょうか?

よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加