2012-03-28 53 views
4

当我调用该函数IdFtp.List抛出套接字错误#10054偶尔

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

事后我已经登录,改变了FTP目录,我得到一个套接字错误#10054异常(“连接被重置同行“)。

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

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

有人知道问题是什么或者我可以如何避免它?

+0

我在一个类似的问题由于我的服务器上不支持'FEAT'命令,因此我将'idftp.AutoIssueFEAT'设置为false,并且问题消失了。但是你从另一个来源得到同样的问题,不知道你的情况是什么。 – 2012-11-02 18:26:23

回答

2

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

+0

奇怪的是,几乎第一个调用引发异常。我只是检查了ftp服务器的日志文件,其他工具如何使用LIST文件(iexplorer,firefox)。一个区别是它们使用PASSIVE模式,然后使用不同的PORT进行数据传输。 – 2012-03-29 05:29:53

+0

“PORT”命令用于主动模式传输,FTP服务器连接到客户端。 'PASV'命令用于被动传输,客户端连接到FTP服务器。被动模式传输对于客户端来说更适合防火墙/路由器的使用。 'TIdFTP'具有'Passive'属性,用于指定使用哪种模式。无论哪种方式,当请求的数据完成传输时,FTP服务器会断开套接字,如果不正确,可能会导致10054错误。我会考虑更新Indy以更好地处理这个问题,但我现在没有ETA。 – 2012-03-29 07:07:54

3

对此可以做的不多,因为断开连接是由FTP服务器完成的。 您有几种选择:

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

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

enter image description here

注意,经过以上设置后,FTP客户端会后的2分钟断开非活动。
将该值设置为0将禁用超时。

+0

在我的机器和其他大多数客户端上工作没有任何问题(因此我不能重现)。我认为这取决于客户端机器。 – 2012-03-29 05:31:47

0

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

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