2016-12-28 7 views
0

저는 온라인이 아닌 호스트에 연결을 시도하는 TIdTCPClient가 있습니다.Indy TIdTCPClient ConnectTimout이 작동하지 않습니다.

업데이트 :이 실제로 운영 체제에 따라되는 문제처럼
조금 더 깊은 Winsock2를 다이빙을 한 후 보인다. 향후 릴리스에서 수정이있을 수 있습니다. (자세한 내용은이 질문의 의견을 참조)

설정 :

  • 델파이 (10) 시애틀
  • 윈도우 7 64 비트
  • 인디 10.6.2.5311

5 초 후에 적어도 ConnectTimeout을 얻을 것으로 예상되므로 ConnectTimeout은 5000ms로 설정됩니다. 그러나 현재 컴퓨터에서는 타임 아웃을 수신하는 데 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 호출이 완료 될 때까지 대기합니다. 내가 볼 수있는 마지막 것은 TIdStackWindows에서'CheckForSocketError (IdWinsock2.connect (ASocket, IdWinsock2.PSOCKADDR (@LAddr), LSize)); '를 호출하여 누군가가 원하는 것과 상관없이 이상한 20 초를 차단합니다. 연결 스레드. – Attix

답변

-2

경우 방화벽을 해제해야합니다.

방화벽을 비활성화하는 대신 적절한 포트를 열어야합니다. 그러나 위험은 높음입니다. 더되기 때문에

. (해킹) 투과