首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误10038“非套接字上的套接字操作”后未定义的TIdFTP状态

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

Stack Overflow用户
提问于 2016-08-30 12:55:38
回答 2查看 975关注 0票数 0

我使用TIdFTP控件连接到FTP服务器。my FTP connection is terminated by something (ftp服务器/防火墙?)经过60秒的无动于衷。一旦连接终止,我就不能再使用FTP控件(TIdFTP)了,因为它的状态是未定义的。例如,每次尝试REconnect时,我都会得到相同的(10038)错误。然而,FTP.Connected显示的是真。尝试FTP.Disconnect会给我一个“连接正常关闭”的错误,而控件仍然是连接的。唯一的解决办法是结束程序并重新启动它。

NAT的生存状态已经设置为15000。

​

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-30 16:28:42

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

TIdFTP有一个NATKeepAlive属性,以避免在通过FTP不知情的路由器/防火墙连接时发生这个确切的问题。在传输期间,在控制连接上临时启用TCP保持生命,这样它就不会过早关闭。

然而,FTP.Connected显示的是真。

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

尝试FTP.Disconnect会给我一个“连接正常关闭”的错误

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

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

您还应该在意外断开连接后对Clear()进行IOHandler.InputBuffer,以清除任何未读数据。

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

这永远不是解决办法。更糟糕的是,您可以简单地销毁TIdFTP对象并创建一个新对象。但是,如果你遵循上述步骤,你甚至不需要求助于此。

票数 1
EN

Stack Overflow用户

发布于 2016-08-31 07:36:38

您不能让TIdFTP保持打开。每次超时时,服务器端都会关闭连接。

当您使用此组件在一段时间间隔内将文件获取或放入文件服务器时,您可以在使用TIDFTP之前进行连接,并在使用后断开连接。然后,您就不需要费心地释放组件和连接故障了。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39228118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档