iOS:如何减少 FTP 连接超时?

Posted

技术标签:

【中文标题】iOS:如何减少 FTP 连接超时?【英文标题】:iOS: How to reduce an FTP connection timeout? 【发布时间】:2013-10-10 10:09:28 【问题描述】:

我正在开发一个使用远程存储数据的 iPhone 应用程序。该应用仅供我们的客户使用(没有应用商店),我不允许指定应用的上下文。

我可以告诉你的唯一上下文是该应用允许输入代码,并下载与该代码相关的数据。

我们的客户告诉我们,有时我们需要在互联网无法访问或速度太慢的地方使用该应用。

已经得出的解决方案如下:

    我们将尝试将数据下载到本地 FTP 服务器上,该服务器实际上只是一个共享目录的路由器,该目录以代码为名称,可通过已知 IP 访问(例如,ftp://192.168.1.1/some-path)。

    如果失败,它会尝试从 Web 服务器下载。

我发现了一个很棒的库,名为 FTPManager,由 Nico Kreipke 编写。 (click here for its GitHub)

很遗憾,当 FTP 地址不可用时,大约需要一分钟才能超时并进入第二步。

有没有人可以帮助减少此超时?也许对 IP 进行快速 ping 操作?如果有,该怎么做?

感谢您的宝贵时间, 蒂亚戈

更多信息

我尝试了一个受 Rauru Ferro 答案启发的解决方案。但不幸的是,它没有帮助。 用于测试的代码如下:

NSString *ftp = [NSString stringWithFormat:@"ftp://user:password@%@/sda1/%@", ip, code]; NSURL *url = [NSURL URLWithString:ftp]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returnedResponse:&response error:&error];

我尝试了几个超时值,但无济于事。它总是以超时错误结束。但是,下载代码能够从路由器的共享目录下载数据(使用相同的凭据)。

【问题讨论】:

【参考方案1】:

尝试使用此代码(是为使用 POST httpMethod 的 http 连接构建的,但只是一个开始):

NSURL *url = [NSURL URLWithString:yourURL];
NSMutableURLRequest *request = [NSMutableURLRequest
                                 requestWithURL:url
                                 cachePolicy:NSURLRequestReloadIgnoringCacheData
                                 timeoutInterval:20.0];
[request setHTTPMethod:@"POST"];

【讨论】:

感谢您的帮助。我尝试过类似的方法,但不幸的是它没有用。它不仅有时会抛出异常,当它没有时,我无法获取任何数据。我将使用我刚刚执行的测试来编辑帖子。 我忘记了凭据:S 我得在有时间的时候重试。目前,在我们修复一些严重错误时,此超时问题已处于待命状态。再次感谢;)【参考方案2】:

连接到服务器时需要考虑一些事项。首先要确定的是“我是否连接到服务器”,第二个是“服务器响应需要多长时间?”。

使用 FTP,首先与服务器建立低级 tcp/ip 连接,然后服务器将响应初始的 2xx 级 Welcome/Hello 消息。

当使用 NSMutableURLRequest 等高级类接口时,可能很难区分连接超时和服务器响应超时。您可能正在连接到服务器,但服务器已陷入困境,并且响应欢迎消息的速度非常慢。

我的建议是使用低级别的通用 BSD 套接字对象,创建套接字,然后连接到服务器。您还可以使用低级别的 setsockopt() 调用来限制 connect() 调用将等待连接的时间量。使用 FTP,您还可以选择执行 recv() 从服务器检索欢迎消息。您可以为此调用设置不同的超时时间,以确保服务器及时响应。

在稍高一点的层面上,CFSocket 类会给你更多来自 BSD 层的封装,但你应该仍然能够打破连接时间和初始响应时间之间的差异。

希望对您有所帮助! 迈克尔

【讨论】:

以上是关于iOS:如何减少 FTP 连接超时?的主要内容,如果未能解决你的问题,请参考以下文章

FTP上传文件连接超时,本地无问题,服务器上面连接超时?

如何减少 ssh 连接超时值

用FTP工具FileZilla“连接超时,读取目录失败”

linux上搭建ftpvsftp, 解决访问ftp超时连接, 解决用户指定访问其根目录,解决ftp主动连接被动连接的问题

如何配置套接字连接超时

如何配置套接字连接超时