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;
這段代碼的結果:
如果連接線程不及時終止,它可能意味着以前調用'關閉()'不會導致套接字API 'connect()'立即中止。雖然這不是所有平臺的保證,但我從未在Windows上看到過這種情況。在另一個線程在'connect()'上被阻塞時關閉一個線程中的套接字應該會導致立即出錯。請進一步診斷以確定真正的問題實際上是否是由於connect()不中止或線程等待不醒來。這是兩個非常不同的問題。 –
感謝您的快速響應,我不確定我是否正確理解您,但我的印象是,在調用'Close'後LThread.WaitFor'需要超過10秒才能完成。 我在說'TIdIOHandlerStack'中的第282行: 'TIdIOHandlerStack.ConnectClient.DoConnectTimeout' – Attix
在我看來,WinSock2在我的機器上有20秒左右的最小阻塞時間。這導致連接線程等待FBinding.Connect的調用完成。 我能看到的最後一件事情是調用CheckForSocketError(IdWinsock2.connect(ASocket,IdWinsock2.PSOCKADDR(@LAddr),LSize));'在TIdStackWindows中阻止那些奇怪的20秒,無論有人想做什麼用連接線。 – Attix