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 连接超时?的主要内容,如果未能解决你的问题,请参考以下文章
linux上搭建ftpvsftp, 解决访问ftp超时连接, 解决用户指定访问其根目录,解决ftp主动连接被动连接的问题