我最近发布了一个关于减少FTP连接超时的问题(click here to see it if you want)。
现在,我被要求发布一个更具体的问题,重点关注我们用于FTP下载的组件。
我们正在使用Nico Kreipke的FTPManager(click here to go to its GitHub)。
我们要尝试实现的是从FTP地址下载数据,如果失败,我们将回退使用HTTPS Web服务器。
当我们提供的FTP地址不可用时,超时大约需要一分钟。
问题是,如何减少超时?
最好的问候,
蒂亚戈
更多信息
我忘了说,FTP连接是通过IP(本地网络)完成的。
Johan的提示
我向FTPManager添加了一个属性,double
名为timeout
。
然后我重写了serverReadStream
的访问器,这是FTPManager中用来保存读取流的属性,因此它可以为所有请求配置超时间隔。
- (NSInputStream *)serverReadStream
{
return _serverReadStream;
}
- (void)setServerReadStream:(NSInputStream *)serverReadStream
{
if ((_serverReadStream = serverReadStream)) {
CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &_timeout);
CFReadStreamSetProperty((__bridge CFReadStreamRef)(_serverReadStream), _kCFStreamPropertyReadTimeout, number);
CFRelease(number);
}
}
_kCFStreamPropertyReadTimeout
的定义是:
#define _kCFStreamPropertyReadTimeout CFSTR("_kCFStreamPropertyReadTimeout")
但是,超时仍需要大约一分钟。在创建ftpManager
之后,我在连接到FTP地址之前设置了超时。我用来设置超时的代码如下:
FTPManager *ftpManager = [[FTPManager alloc] init];
[ftpManager setTimeout:10];
答案 0 :(得分:0)
我认为可以通过简单地设置CFReadStream的属性来完成。所以你可能需要继承FTPManager。
该属性称为_kCFStreamPropertyReadTimeout。
#define _kCFStreamPropertyReadTimeout CFSTR("_kCFStreamPropertyReadTimeout")
然后将其添加到适当的方法中。
double timeout = 30;
CFReadStreamRef readStream = CFReadStreamCreateWithFTPURL(NULL, (__bridge CFURLRef)[[server.destination ftpURLForPort:server.port] URLByAppendingPathComponent:fileName]);
CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &timeout);
CFReadStreamSetProperty(readStream, _kCFStreamPropertyReadTimeout, number);
CFRelease(num);
答案 1 :(得分:0)
您是否尝试过使用performSelector:withObject:afterDelay:
和自定义方法检查是否已建立连接并且可以接收数据,或者调用[ftpManager abort]
?
不是一个真正的连接超时,看起来有点脏,但应该做的工作。