0

我需要使用 TCP/IP 连接连接到本地网络上的设备。当我使用 TIdTCPClient 时,一切正常,除了一件事:

如果连接不可用,大约需要 18-20 秒才能超时。无论我设置什么值,属性 ConnectTimeout 都不起作用。在超时之前总是需要相同的时间。

这个答案提到了超时的长时间延迟,我想知道这是否与 Indy 组件有关?

我必须找出连接是否不能很快建立,比如说最多在 1 秒内。

有没有办法使用 Indy 来做到这一点,还是我需要使用不同的组件/不同的方法?

(我使用的是 Delphi 2009 附带的 Indy 10 版本)

编辑
我按照这篇文章中的说明将 Indy 升级到最新版本。

还是一样,现在在没有连接时 TCPClient.Connect 返回始终需要 22 秒。ConnectTimeout 和/或 ReadTimeout 似乎对此没有影响。

4

3 回答 3

5

ConnectTimeout 适用于 2010 和 XE。也许您可以将您的 Indy 版本更新到最新版本(免费)。我有一个“快速检查”连接的功能,只是为了检查设备的可用性,这些超时是 5 秒没有问题(在 2010 和 XE 中)。

于 2011-02-15T16:02:00.630 回答
2

使用默认的 TCP 客户端连接超时(未专门设置)和 1 秒的读取超时,使用 Delphi 2010 和最新的 Indy 版本,本地连接(使用 localhost 作为主机名)在 1 秒内超时。所以这绝对不是 Delphi/Indy 问题。顺便说一句,这给了我一个 EIdSocketError(“套接字错误#10061 连接被拒绝”)。

于 2011-02-15T21:03:24.797 回答
1

我有同样的问题。查看这个 StackOverflow 帖子

简而言之,因为 Indy 线程是阻塞的,所以您需要创建一个线程化进程。然后在主应用程序中创建一个计时器,如果它没有在给定的时间内完成它应该做的事情,它将终止线程。

在我实施之后,效果很好。

于 2011-02-15T17:16:56.100 回答