1

我开发了一个使用 indy 组件从远程服务器下载更新的应用程序。问题是如果 FTP 服务器宕机或 IP 地址不正确,idFTP.connect() 需要很长时间才能给出结果(连接失败)。

加速连接答案的最佳方法是什么,或者可能是在连接到 idFTP 之前检查 IP 地址。

提前致谢。

4

3 回答 3

2

您应该设置 ReadTimeout 属性,默认设置为一分钟。

于 2013-01-16T09:01:39.707 回答
2

默认情况下,Indy 客户端会等待操作系统报告连接是否成功。是的,这可能需要很长时间,如果操作系统必须使用 DNS 查找主机名,进行网络检查,处理网络延迟等。如果您不想等待那么长时间,您可以使用Indy中的Timeout参数Connect()9 和更早的版本,或ConnectTimeoutIndy 10 中的属性,以减少等待的时间。 但是,这仅适用于确定服务器 IP 后的实际套接字连接尝试。如果您将该Host属性设置为非 IP 主机名,Indy 会要求操作系统执行 DNS 查找以获取主机名的 IP,并且没有可用的逻辑Connect()来控制执行该查找所需的时间。如果您需要那么多控制,请使用TIdDNSResolver手动获取 IP,然后Host在调用之前将其分配给属性Connect()

于 2013-01-17T01:50:30.280 回答
1

好吧,本机 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。

于 2013-01-16T11:29:12.283 回答