设置为500毫秒时,某些* PC上的TCP连接超时为20或21秒

时间:2012-08-22 02:41:16

标签: delphi tcp indy10

我获得了10台新PC,全部(据称)已经安装了Windows 7 Pro,并且没有其他任何操作。

我有一个用Delphi XE2编码的程序,使用Indy 10组件进行网络连接。我将TIdTcpCleint的“连接超时”和“读取超时”属性设置为500ms,将“resuse socket”设置为“o / s dependent”“(我还尝试将其设置为No的构建)并保留”use Nagle“ (无论设置为什么(我也试过假)。

这就是问题:当我在这些PC上运行相同的.EXE并测试我拉网线的情况时,我的调试跟踪显示连接尝试/连接超时发生在同一秒或下一秒(带有粒度为1秒) - 但在其他情况下,在我看到连接超时之前是20或21秒。

虽然我看不到没有安装aps,但似乎有些PC不是完全“全新安装”。也许有人安装了一些然后删除它,也许他们试图调整性能。

在我在10台PC上重新安装Windows之前,有人可以建议去哪里看看吗?关于TCP客户端连接超时,20(或21)秒是否响铃?

[更新]我试图直接连接到特定的IP地址,所以我不确定@Nikolai检查DNS的建议是否相关。很抱歉没有提到这个。

[upperdate]程序不会尝试保持套接字打开。它连接,发送一些数据和对于每个新数据,重复断开连接。

2 个答案:

答案 0 :(得分:6)

可悲的是,这是按预期工作的。连接已经超时了。 Indy确定连接将在您要求的500毫秒内失败。但是,这并不能保证函数将返回

连接超时后,Indy会关闭连接以释放其所有资源。它同步这样做。这意味着您最终等待底层TCP操作失败。这通常需要20秒。

解决方案是在线程中调用connect。信不信由你,这就是Indy已经实现超时的方法。但是,当它超时等待线程时,它会尝试关闭主线程中的连接。您需要将其推迟到工作线程。

至于为什么它会在某些系统上立即发生,而在其他系统上会在20秒内发生,这取决于精确的网络配置。例如,如果启用了IPv6,则堆栈可能会尝试使用IPv6到IPv4连接,即使物理接口已关闭,也可能无法报告。无法保证立即检测连接不可能,您不应该依赖它。

答案 1 :(得分:1)

过去我和INDY有同样的问题(使用D6,1998-2000)。我将组件更改为IP * Works。那时它是一个外部组件,但据我所知,它包含在XE2中。 Ip * Works在开始时有点难以理解,但它们接近通信结构的方式却有很大不同。

我认为值得尝试一下。