我需要使用TCP / IP连接连接到本地网络上的设备。 当我使用TIdTCPClient时,一切都运行良好,除了一件事:
如果连接不可用,我需要大约18-20秒才能获得超时。 无论我设置什么值,ConnectTimeout属性都没有效果。在超时之前总是花费相同的时间。
This answer提到超时的延迟时间很长,我想知道这是否与Indy组件有关?
我必须找出连接是否无法很快建立,比如说最多只能在1秒内完成。
使用Indy有没有办法做到这一点,还是需要使用不同的组件/不同的方法?
(我使用的是Delphi 2009附带的Indy 10版本)
修改:
我按照说明将Indy升级到this post中的最新版本。
仍然相同,它现在始终需要22秒,直到TCPClient.Connect在没有连接时返回。 ConnectTimeout和/或ReadTimeout似乎对此没有影响。
答案 0 :(得分:5)
ConnectTimeout适用于2010和XE。也许您可以将Indy版本更新为最新版本(免费版)。我有一个“快速检查”连接的功能,只是为了检查设备的可用性,这些超时是5秒没有问题(2010年和XE)。
答案 1 :(得分:2)
使用默认的TCP客户端连接超时(未特别设置)和读取超时1秒,使用Delphi 2010和最新的Indy版本,本地连接(使用localhost作为主机名)在1秒内超时。所以这绝对不是Delphi / Indy问题。顺便说一句,这给了我一个EIdSocketError("套接字错误#10061连接被拒绝")。
答案 2 :(得分:1)
我遇到了同样的问题。查看this StackOverflow post。
简而言之,因为Indy线程正在阻塞,所以您需要进行线程化处理。然后在主应用程序中创建一个计时器,如果它没有在给定的时间内完成它应该做的事情,它将终止该线程。
我实施后,这很有效。