Delphi idFTP花费的时间太长,无法给出连接结果

Delphi idFTP花费的时间太长,无法给出连接结果,delphi,ftp,connection,indy,Delphi,Ftp,Connection,Indy,我开发了一个应用程序,使用indy组件从远程服务器下载更新。 问题是,如果FTP服务器关闭或IP地址不正确,idFTP.connect()将花费太长时间给出结果(连接失败) 加速连接应答的最佳方法是什么,或者在连接到idFTP之前检查ip地址 提前感谢。您应该设置ReadTimeout属性,默认设置为一分钟。您应该设置ReadTimeout属性,默认设置为一分钟。好吧,native connect()API超时在设计上是出了名的长,(以适应调制解调器等高延迟链接)。人为地缩短超时时间可能会导致过

我开发了一个应用程序,使用indy组件从远程服务器下载更新。 问题是,如果FTP服务器关闭或IP地址不正确,idFTP.connect()将花费太长时间给出结果(连接失败)

加速连接应答的最佳方法是什么,或者在连接到idFTP之前检查ip地址


提前感谢。

您应该设置ReadTimeout属性,默认设置为一分钟。

您应该设置ReadTimeout属性,默认设置为一分钟。

好吧,native connect()API超时在设计上是出了名的长,(以适应调制解调器等高延迟链接)。人为地缩短超时时间可能会导致过早的故障通知(尽管许多开发人员从未见过调制解调器,但现在这并不是什么大问题:)

FTP是一种相当复杂的传输,需要两个TCP连接,可能还需要一个DNS查找,其中任何一个都可能产生较长的连接延迟。TidFTP有一个继承的'ReadTimeout'属性和一个带有超时参数的connect()重载,但我不确定它们的效果如何

历史上,我总是自己使用TTimer或类似工具来超时此类操作-如果FTP线程没有及时响应适当的信号(例如TThread.Sychronize或用户定义的Windows message SendMessage()'d到GUI),则,将执行“FTP失败”操作,并在FTP线程中设置一个标志,告知其忽略任何回复并自行终止。不要使用PostMessage—如果使用,则在TTimer启动时,会有一个很小的时间窗口,在此时间窗口中,已发布的响应将排队—这是一场竞赛

哦-如果您只是将一个TidFTP链接到表单上(或在TForm.FormCreate中创建一个),并尝试从主GUI线程运行它(使用或不使用TIDFantiquence),请停止此操作并退出FTP。

好吧,native connect()API超时在设计上是出了名的长,(以适应调制解调器等高延迟链接)。人为地缩短超时时间可能会导致过早的故障通知(尽管许多开发人员从未见过调制解调器,但现在这并不是什么大问题:)

FTP是一种相当复杂的传输,需要两个TCP连接,可能还需要一个DNS查找,其中任何一个都可能产生较长的连接延迟。TidFTP有一个继承的'ReadTimeout'属性和一个带有超时参数的connect()重载,但我不确定它们的效果如何

历史上,我总是自己使用TTimer或类似工具来超时此类操作-如果FTP线程没有及时响应适当的信号(例如TThread.Sychronize或用户定义的Windows message SendMessage()'d到GUI),则,将执行“FTP失败”操作,并在FTP线程中设置一个标志,告知其忽略任何回复并自行终止。不要使用PostMessage—如果使用,则在TTimer启动时,会有一个很小的时间窗口,在此时间窗口中,已发布的响应将排队—这是一场竞赛


哦-如果您只是将一个TidFTP链接到表单上(或在TForm.FormCreate中创建一个),并尝试从主GUI线程运行它(使用或不使用TIDFantique),请停止此操作并退出FTP。

默认情况下,Indy客户端会等待操作系统报告连接是否成功。是的,如果操作系统必须使用DNS查找主机名、进行网络检查、处理网络延迟等,这可能需要很长时间。如果您不想等待那么长时间,可以使用Indy 9及更早版本中
Connect()
Timeout
参数,或Indy 10中的
ConnectTimeout
属性,减少等待的时间但是,这仅适用于确定服务器IP后的实际套接字连接尝试。如果将
Host
属性设置为非IP主机名,Indy会要求操作系统执行DNS查找以获取主机名的IP,而
Connect()
中没有可用的逻辑来控制查找所需的时间。如果您需要如此多的控制,请使用
TIdDNSResolver
手动获取IP,然后在调用
Connect()
之前将其分配给
Host
属性。默认情况下,Indy客户端会等待操作系统报告连接是否成功。是的,如果操作系统必须使用DNS查找主机名、进行网络检查、处理网络延迟等,这可能需要很长时间。如果您不想等待那么长时间,可以使用Indy 9及更早版本中
Connect()
Timeout
参数,或Indy 10中的
ConnectTimeout
属性,减少等待的时间但是,这仅适用于确定服务器IP后的实际套接字连接尝试。如果将
Host
属性设置为非IP主机名,Indy会要求操作系统执行DNS查找以获取主机名的IP,而
Connect()
中没有可用的逻辑来控制查找所需的时间。如果您需要如此多的控制,请使用
TIdDNSResolver
手动获取IP,然后在调用
Connect()

@Riad之前将其分配给
Host
属性,我刚刚讨论了您前面的所有问题。你确定他们都没有得到一个可以接受的答案吗?因为看起来您确实忘记了勾选可接受的答案。对不起,我将勾选可接受的答案。您需要设置Windows TCP/IP层超时设置。@Riad,我刚刚回答了您之前的所有问题。你确定他们都没有得到一个可以接受的答案吗?因为看起来您确实忘记了勾选可接受的答案。抱歉,我将勾选可接受的答案。您需要设置Windows TCP/IP层超时设置。我已经尝试过了,