我使用TIdFTP控件连接到FTP服务器。在60秒不活动后,似乎my FTP connection is terminated by something(ftp服务器/防火墙?)。一旦连接终止,我就不能再使用FTP控件(TIdFTP)了,因为它的状态是未定义的。例如,每次我尝试重新连接时,我都会得到相同的(10038)错误。但是,FTP.Connected显示True。尝试使用FTP.Disconnect让我能够优雅地关闭连接'错误,控件保持连接状态。唯一的解决方案是结束程序并重新启动它。
如何重置FTP控件的状态(如何断开连接)?
答案 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之前进行连接,并在使用后断开连接。然后,您无需担心释放组件和连接失败。