2016-12-28 4 views
0

J'ai un TIdTCPClient qui essaie de se connecter à un hôte qui n'est pas en ligne.Indy TIdTCPClient ConnectTimout ne fonctionne pas

MISE À JOUR:
Après avoir plongé un peu plus profondément dans WinSock2 il semble que c'est en effet une question qui dépend de votre système d'exploitation. Peut-être qu'il y aura une correction dans une future version. (Voir les commentaires de cette question pour plus de détails)

Configuration:

  • Delphi 10 Seattle
  • Windows 7 64 bits
  • Indy 10.6.2.5311

Le ConnectTimeout est réglé à 5000 ms, donc je m'attends à obtenir au moins un ConnectTimeout après 5 secondes. Cependant, sur ma machine actuelle, il faut plus de 20 secondes pour recevoir ce délai.

Jusqu'à présent, je vois que le ConnectionTimeout est traitée correctement, mais sur TIdIOHandlerStack.ConnectClient il y a un WaitFor sur le fil qui effectue la tentative de connexion réelle. Je pense que cela cause le délai de connexion retardé, mais je ne sais pas ce que je pourrais faire à ce sujet. Des idées?

code:

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; 

Résultat de ce code:

image

+0

Si le fil de connexion est ne pas mettre fin en temps opportun, cela signifie probablement l'appel précédent à 'Fermer()' ne provoque pas l'API socket 'connect()' pour annuler immédiatement. Bien que ce ne soit pas une garantie sur toutes les plates-formes, je n'ai jamais vu cela se produire sur Windows. Fermer une socket dans un thread alors qu'un autre thread est bloqué sur 'connect()' devrait provoquer une erreur immédiate. S'il vous plaît diagnostiquer plus loin pour déterminer si le vrai problème est réellement avec le 'connect()' n'abandonner pas ou le fil n'attend pas se réveiller. Ce sont deux problèmes très différents. –

+0

Merci pour votre réponse rapide, je ne suis pas sûr si je vous comprends correctement mais mon impression est, qu'après avoir appelé 'Close' le' LThread.WaitFor' a besoin de plus de 10 secondes pour terminer. Je parle de la ligne 282 dans 'TIdIOHandlerStack': ' TIdIOHandlerStack.ConnectClient.DoConnectTimeout' – Attix

+0

Il me semble que WinSock2 a une sorte de temps de blocage minimum d'environ 20 secondes sur ma machine. Cela amène le thread de connexion à attendre son appel de FBinding.Connect pour terminer. La dernière chose que je peux voir est l'appel de 'CheckForSocketError (IdWinsock2.connect (ASocket, IdWinsock2.PSOCKADDR (@LAddr), LSize)); dans TIdStackWindows qui bloque pour ces étranges 20 secondes, peu importe ce que quelqu'un veut faire avec le fil de connexion. – Attix

Répondre

-2

Si la destination est un pare-feu et le pare-feu est activé, vous devez désactiver le pare-feu.

Au lieu de désactiver le pare-feu, vous devez ouvrir les ports appropriés. Cependant, les risques sont haut.

Parce qu'il devient plus perméable. (Hack)