2016-12-28 78 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()不中止或線程等待不醒來。這是兩個非常不同的問題。 –

+0

感謝您的快速響應,我不確定我是否正確理解您,但我的印象是,在調用'Close'後LThread.WaitFor'需要超過10秒才能完成。 我在說'TIdIOHandlerStack'中的第282行: 'TIdIOHandlerStack.ConnectClient.DoConnectTimeout' – Attix

+0

在我看來,WinSock2在我的機器上有20秒左右的最小阻塞時間。這導致連接線程等待FBinding.Connect的調用完成。 我能看到的最後一件事情是調用CheckForSocketError(IdWinsock2.connect(ASocket,IdWinsock2.PSOCKADDR(@LAddr),LSize));'在TIdStackWindows中阻止那些奇怪的20秒,無論有人想做什麼用連接線。 – Attix

回答

-2

如果目的地是防火牆並啓用了防火牆,則必須禁用防火牆。

而不是禁用防火牆,您必須打開適當的端口。但是,風險是

因爲它變得更加可滲透。(哈克