Maw*_*awg 11 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]程序不会尝试保持套接字打开.它为每个新数据连接,发送一些数据并重复断开连接.
可悲的是,这是按预期工作的.连接已经超时了.Indy确定连接将在您要求的500毫秒内失败.但是,这并不能保证函数会返回.
在连接超时后,Indy将连接旋转以释放其所有资源.它同步这样做.这意味着您最终等待底层TCP操作失败.这通常需要20秒.
解决方案是在线程中调用connect.信不信由你,这就是Indy已经实现超时的方法.但是,当它超时等待线程时,它会尝试关闭主线程中的连接.您需要将其推迟到工作线程.
至于为什么它会在某些系统上立即发生,而在其他系统上会在20秒内发生,这取决于精确的网络配置.例如,如果启用了IPv6,则堆栈可能会尝试使用IPv6到IPv4连接,即使物理接口已关闭,也可能无法报告.无法保证立即检测连接不可能,您不应该依赖它.
| 归档时间: |
|
| 查看次数: |
5325 次 |
| 最近记录: |