我开发了一个使用 indy 组件从远程服务器下载更新的应用程序。问题是如果 FTP 服务器宕机或 IP 地址不正确,idFTP.connect() 需要很长时间才能给出结果(连接失败)。
加速连接答案的最佳方法是什么,或者可能是在连接到 idFTP 之前检查 IP 地址。
提前致谢。
我开发了一个使用 indy 组件从远程服务器下载更新的应用程序。问题是如果 FTP 服务器宕机或 IP 地址不正确,idFTP.connect() 需要很长时间才能给出结果(连接失败)。
加速连接答案的最佳方法是什么,或者可能是在连接到 idFTP 之前检查 IP 地址。
提前致谢。
您应该设置 ReadTimeout 属性,默认设置为一分钟。
默认情况下,Indy 客户端会等待操作系统报告连接是否成功。是的,这可能需要很长时间,如果操作系统必须使用 DNS 查找主机名,进行网络检查,处理网络延迟等。如果您不想等待那么长时间,您可以使用Indy中的Timeout
参数Connect()
9 和更早的版本,或ConnectTimeout
Indy 10 中的属性,以减少等待的时间。 但是,这仅适用于确定服务器 IP 后的实际套接字连接尝试。如果您将该Host
属性设置为非 IP 主机名,Indy 会要求操作系统执行 DNS 查找以获取主机名的 IP,并且没有可用的逻辑Connect()
来控制执行该查找所需的时间。如果您需要那么多控制,请使用TIdDNSResolver
手动获取 IP,然后Host
在调用之前将其分配给属性Connect()
。
好吧,本机 connect() API 超时在设计上是出了名的冗长,(以适应调制解调器等高延迟链接)。人为地缩短超时可能会导致过早的故障通知,(尽管许多开发人员从未见过调制解调器,但今天这不是什么大问题:)。
FTP 是一个相当复杂的传输,需要两个 TCP 连接,可能还需要一个 DNS 查找——这些都可能会产生较长的连接延迟。TidFTP 具有继承的“ReadTimeout”属性和带有超时参数的 connect() 重载,但我不确定它们的效果如何。
从历史上看,我自己总是使用 TTimer 或类似工具来超时此类操作 - 如果 FTP 线程没有以合适的信号响应(例如,TThread.Sychronize 或用户定义的 Windows 消息 SendMessage()'d 到 GUI),及时采取了“FTP 失败”操作,并在 FTP 线程中设置了一个标志,告诉它忽略任何回复并自行终止。不要使用 PostMessage - 如果你这样做了,那么在 TTimer 触发时,我会在一小段时间内将发布的响应排队 - 一场比赛。
哦-如果您只是将 TidFTP 插入表单(或在 TForm.FormCreate 中创建一个),并尝试从主 GUI 线程(有或没有 TidAntiFreeze)运行它,请停止执行并关闭FTP。