【问题标题】:idFTP takes too long to give connection resultidFTP 需要太长时间才能给出连接结果
【发布时间】:2013-01-16 08:18:37
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • @Riad,我刚刚解决了您之前提出的所有问题。你确定他们都没有得到可接受的答案吗?因为看起来您似乎只是忘记勾选已接受的答案标记。
  • 对不起,我会在可接受的地方打勾
  • 也许您需要设置 Windows TCP/IP 层超时设置。

标签: delphi ftp connection indy


【解决方案1】:

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

【讨论】:

  • 我已经尝试过了,属性设置为0,我尝试更改它但结果是一样的
  • @riad 这里的关键是发现有问题需要时间。计算机必须发送一个(或多个)数据包,并等待来自另一端的响应。只有过一段时间才能知道它是否有效。你所能做的就是早点停止等待。从用户的角度来看,您可以将其放入线程中以允许他们做其他事情,但基本上您无能为力。
  • @mj2008,感谢您的回复,这正是我在发布问题之前所做的,我认为我可能会错过 idFTP 中的其他属性。但是在检查了答案和 cmets 之后,我认为唯一的方法是将连接放在一个线程中。
  • ReadTimeout 默认设置为 INFINITE。 Indy 10 中还有一个单独的 ConnectTimeout 属性(Indy 9 中 Connect() 本身的 ATimeout 参数),默认情况下也设置为 INFINITE。如果 Connect() 超时设置为 0 并使用 TIdAntiFreeze,则 Connect() 使用 2 分钟超时。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • Connect()Timeout 参数仅适用于 Indy 9 及更早版本。在 Indy 10 中,它被一个新的 ConnectTimeout 属性所取代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 2012-03-17
    • 2020-01-08
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多