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

Undefined TIdFTP status after error 10038 “Socket operation on non-socket”

我使用 TIdFTP 控件连接到 FTP 服务器。似乎 (ftp server/firewall?) 在 60 秒不活动后。连接终止后,我无法再使用 FTP 控件 (TIdFTP),因为它的状态未定义。例如,每次我尝试重新连接时,我都会遇到相同的 (10038) 错误。但是,FTP.Connected 显示 True。尝试 FTP.Disconnect 给我一个 'connection closed gracefully' 错误,并且控件保持连接。唯一的解决办法就是结束程序,重新启动。

NAT Keep Alive 已设置为 15000。

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

I use a TIdFTP control to connect to an FTP server. It seems that my FTP connection is terminated by something (ftp server/firewall?) after 60 seconds of inactivity

TIdFTP 有一个 NATKeepAlive 属性 来避免在通过 FTP-unaware router/firewall 连接时发生确切的问题。在传输期间,TCP keepalive 在控制连接上临时启用,因此它不会过早关闭。

However, FTP.Connected shows True.

这意味着 IOHandler.InputBuffer 中可能有未读数据。 Connected() 被设计为 return 如果即使套接字已关闭仍能满足读取操作,则为真。

Trying FTP.Disconnect gives me a 'connection closed gracefully' error

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

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

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

The only solution is to end the program and start it again.

这永远不是解决方案。更糟糕的情况是,您可以简单地销毁 TIdFTP 对象并创建一个新对象。但是如果你按照上面的步骤,你应该不需要求助于那个。

您不能让 TIdFTP 保持打开状态。对于每个超时时间,连接将从服务器端关闭。

当您使用此组件在一段时间内获取文件或将文件放入文件服务器时,您可以在使用 TIDFTP 之前连接,并在使用后断开连接。然后你就不需要为释放组件和连接失败而烦恼了。