2016-12-28 12 views
0

私は、オンラインではないホストに接続しようとしているTIdTCPClientを持っています。Indy TIdTCPClient ConnectTimoutが動作しない

UPDATE:
これが実際に使用しているオペレーティングシステムに応じている問題であるように思えるWINSOCK2に少し深く潜水した後。多分将来のリリースでの修正があるでしょう。 (詳細については、この質問のコメントを参照してください)

セットアップ:

  • デルファイ10シアトル
  • のWindows 7 64ビット
  • インディ10.6.2.5311

ConnectTimeoutは5000ミリ秒に設定されているので、少なくとも5秒後にConnectTimeoutを取得すると予想されます。しかし、私の現在のマシンでは、タイムアウトを受信するのに20秒以上かかる。

は、これまでのところ私はのConnectionTimeoutが正しく処理されていることがわかりますがTIdIOHandlerStack.ConnectClient上の実際の接続試行を行い、スレッド上WAITFORあります。 これは遅延接続のタイムアウトを引き起こしていると思いますが、私はそれについて何ができるのか分かりません。何か案は?

コード:このコードの

procedure TForm1.btn1Click(Sender: TObject); 
begin 
    try 
    Self.mmo1.Lines.Add(TimeToStr(now)); 
    Self.idtcpclnt1.Host := '192.148.89.112'; 
    Self.idtcpclnt1.Port := 9200; 
    Self.idtcpclnt1.Connect; 
    except on E: Exception do 
    Self.mmo1.Lines.Add(TimeToStr(now)+ ' : '+E.Message); 
    end; 
end; 

procedure TForm1.idtcpclnt1Status(ASender: TObject; const AStatus: TIdStatus; 
    const AStatusText: string); 
begin 
    Self.mmo1.Lines.Add(TimeToStr(now)+ ' : ' +AStatusText); 
end; 

結果:

image

+0

接続スレッドが適時に終了されていない場合、それはおそらく '閉じる(前回の呼び出しを意味)は'ソケットAPIを引き起こしていません直ちに中止するには 'connect()'を使います。これはすべてのプラットフォームで保証されているわけではありませんが、私はそれがWindows上で起こったことは一度もありません。 'connect()'で別のスレッドがブロックされている間にあるスレッドでソケットを閉じると、すぐにエラーが発生します。実際の問題が実際に 'connect()'が中断していないか、スレッドが起床していないかどうかをさらに調べてください。それらは2つの非常に異なる問題です。 –

+0

あなたの素早い返答をありがとう、私はあなたが正しく理解しているかどうかはわかりませんが、私の印象は、 'Close'を呼び出した後、' LThread.WaitFor'が完了するのに10秒以上が必要だということです。 私は 'TIdIOHandlerStack'の行282について話しています: 'TIdIOHandlerStack.ConnectClient.DoConnectTimeout' – Attix

+0

WinSock2は私のマシン上で20秒ほどの最小ブロック時間を持っているようです。これは、FBinding.Connectの呼び出しが完了するまで、接続スレッドが待機する原因となります。 私が見ることができる最後のことは、誰かが何をしたいのかにかかわらず、それらの奇妙な20秒をブロックするTIdStackWindowsの 'CheckForSocketError(IdWinsock2.connect(ASocket、IdWinsock2.PSOCKADDR(@LAddr)、LSize));接続スレッドを使用します。 – Attix

答えて

-2

先がファイアウォールで、ファイアウォールが有効になっている場合は、ファイアウォールを無効にする必要があります。

ファイアウォールを無効にする代わりに、適切なポートを開く必要があります。ただし、リスクは高いです。

それは浸透以上になりますので。(ハック

関連する問題