错误10038“非套接字上的套接字操作”后未定义的TIdFTP状态

时间:2016-08-30 12:55:39

标签: delphi ftp indy

我使用TIdFTP控件连接到FTP服务器。在60秒不活动后,似乎my FTP connection is terminated by something(ftp服务器/防火墙?)。一旦连接终止,我就不能再使用FTP控件(TIdFTP)了,因为它的状态是未定义的。例如,每次我尝试重新连接时,我都会得到相同的(10038)错误。但是,FTP.Connected显示True。尝试使用FTP.Disconnect让我能够优雅地关闭连接'错误,控件保持连接状态。唯一的解决方案是结束程序并重新启动它。

NAT Keep Alive已设置为15000.
enter image description here

如何重置FTP控件的状态(如何断开连接)?

2 个答案:

答案 0 :(得分:1)

  

我使用TIdFTP控件连接到FTP服务器。似乎我的FTP连接在60秒不活动后被某些东西(ftp服务器/防火墙?)终止

TIdFTP具有NATKeepAlive属性,可以避免在通过FTP-unaware路由器/防火墙连接时发生确切问题。在传输过程中,TCP keepalive会暂时在控制连接上启用,因此不会过早关闭。

  

但是,FTP.Connected显示为True。

这意味着IOHandler.InputBuffer可能包含未读数据。如果即使套接字已经关闭,仍然可以满足读取操作,Connected()被设计为返回True。

  

尝试使用FTP.Disconnect让我能够优雅地关闭连接'错误

默认情况下,Disconnect()在关闭套接字之前向服务器发送QUIT命令。由于连接已经消失,因此发送失败。

Disconnect()有一个可选的ANotifyPeer参数,您可以将其设置为False以跳过QUIT命令。

在意外断开连接后,您还应Clear() IOHandler.InputBuffer清除所有未读数据。

  

唯一的解决方案是结束程序并重新启动它。

这绝不是解决方案。更糟糕的情况是,您可以简单地销毁TIdFTP对象并创建一个新对象。但是如果你按照上面的步骤进行操作,你就不应该诉诸于此。

答案 1 :(得分:-1)

您无法保持TIdFTP开放。每个超时时间都将从服务器端关闭连接。

当您使用此组件将文件提取或放入文件服务器一段时间时,您可以在使用TIDFTP之前进行连接,并在使用后断开连接。然后,您无需担心释放组件和连接失败。