【问题标题】:IdFtp.List throws socket-error #10054 occasionallyIdFtp.List 偶尔会抛出 socket-error #10054
【发布时间】:2012-03-28 13:12:35
【问题描述】:

当我调用函数时

IdFtp.List(myList, '', false);

之后我登录并更改了 ftp 目录,我偶尔会收到一个 socket-error #10054 异常(“Connection reset by peer.”)。

当我调用该函数时,例如连续 20 次我得到了 1 次异常。

这个问题我只在 Vista 操作系统上遇到过。

有谁知道问题出在哪里或者我可以如何避免它?

【问题讨论】:

  • 我在连接时遇到了类似的问题,由于我的服务器不支持FEAT 命令,我将idftp.AutoIssueFEAT 设置为false,问题就消失了。但是你从不同的来源得到了同样的问题,不知道你的情况是什么。

标签: delphi ftp indy10


【解决方案1】:

您对此无能为力,因为断开连接是由 FTP 服务器完成的。 您有几个选择:

  • 在您的 FTP 服务器连接设置中增加(或禁用)超时设置(每个 FTP 服务器都有不同的名称)。
  • 通过定期发送NOOP 命令告诉服务器您还活着(切换到被动模式也有帮助)。
  • 捕获该异常并静默重新连接(这是我的首选解决方案,因为我们有许多 FTP 服务器,我不相信系统管理员会更改 FTP 服务器超时设置)。

这是来自FileZilla FTP 服务器超时设置的屏幕截图:

请注意,使用上述设置,FTP 客户端将在 2 分钟不活动后断开连接。
将该值设置为 0,将禁用超时。

【讨论】:

  • 在我的机器和大多数其他客户端上,它可以正常工作(因此我无法重现)。我认为这取决于客户端机器。
【解决方案2】:

FTP 协议使用多个套接字连接。每次调用List() 时,都会建立一个新的套接字连接来传输请求的列表数据。听起来 FTP 服务器并不总是在传输结束时正确关闭套接字。

【讨论】:

  • 奇怪的是,几乎第一次调用就会抛出异常。我刚刚检查了ftp服务器日志文件,其他工具如何列出文件(iexplorer、firefox)。一个区别是它们使用 PASSIVE 模式,然后使用不同的 PORT 进行数据传输。
  • PORT 命令用于主动模式传输,其中 FTP 服务器连接到客户端。 PASV 命令用于被动传输,客户端连接到 FTP 服务器。被动模式传输对客户端使用更加防火墙/路由器友好。 TIdFTP 有一个 Passive 属性,用于指定要使用的模式。无论哪种方式,当请求的数据传输完成时,FTP 服务器都会断开套接字,如果操作不正确,可能会导致 10054 错误。我会考虑更新 Indy 以更好地处理这个问题,但我现在没有 ETA。
【解决方案3】:

在组件“IdFTP”中,更改以下属性:

  • “被动”=“假”
  • "TransferType" = "ftASCII"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2012-05-17
    • 1970-01-01
    • 2020-01-25
    • 2013-11-17
    • 2016-03-24
    • 2017-06-23
    相关资源
    最近更新 更多