NSConnection关闭时不从FTP断开连接
我正在使用苹果公司SimpleFTPSample示例代码的编辑版本,特别是“PUT”部分。其中有这种方法:NSConnection关闭时不从FTP断开连接
- (void)stopSendWithStatus:(NSString *)statusString
{
if (self.networkStream != nil) {
[self.networkStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.networkStream.delegate = nil;
[self.networkStream close];
self.networkStream = nil;
}
if (self.fileStream != nil) {
[self.fileStream close];
self.fileStream = nil;
}
[self sendDidStopWithStatus:statusString];
uploaderbusy = 0;
}
问题是上传后应用程序不关闭连接。上面的代码被执行。这两个IF语句都是正确的,并且内部的代码被执行。
此代码:
NSLog(@"%lu",[self.networkStream streamStatus]);
[self.networkStream close];
NSLog(@"%lu",[self.networkStream streamStatus]);
给出了这样的输出:
2013-03-03 17:50:26.460 Stockuploader[575:303] 2
2013-03-03 17:50:26.498 Stockuploader[575:303] 6
但连接保持打开状态,并最终超时。这是FTP服务器的日志:
(000006)03/03/2013 17.50.27 - root2 (192.168.0.3)> 150 Connection accepted
(000006)03/03/2013 17.50.27 - root2 (192.168.0.3)> 226 Transfer OK
(000006)03/03/2013 17.52.28 - root2 (192.168.0.3)> 421 Connection timed out.
(000006)03/03/2013 17.52.28 - root2 (192.168.0.3)> disconnected.
这是为什么?
如果我关闭程序,那么连接立即在FTP上关闭。难道是我不得不释放self.filestream?如果是这样,我怎么能用ARC启用它?
---- ---- UPDATE
我发现,在我关闭连接我要送“退出”到FTP服务器,以让他知道,我想断开连接。但我怎样才能实现发送“QUIT”命令到SimpleFTPSample
?
之前打开连接,您必须将kCFStreamPropertyFTPAttemptPersistentConnection
属性设置为FALSE:
[self.networkStream setProperty:(id)kCFBooleanFalse
forKey:(id)kCFStreamPropertyFTPAttemptPersistentConnection];
那么FTP流关闭控制和数据连接时,它被关闭。
从文档:
kCFStreamPropertyFTPAttemptPersistentConnection
FTP尝试持久 连接流属性设置键和复制操作。将此 属性设置为kCFBooleanTrue
以启用现有服务器 连接的重用;将此属性设置为kCFBooleanFalse
以不重用 现有服务器连接。默认情况下,此属性设置为kCFBooleanTrue
。
我也在使用Apple的simpleFTPSample。我也遇到与“@Just me”相同的问题,但在我的情况下,由于带宽有时上传速度变慢,然后如果我点击“取消上传”重试,它会崩溃,并进入iPhone主屏幕。 点击“取消上传”时,我在等同于问题中显示的代码。 – Shailesh 2013-03-05 07:02:07
IT WORKEDDDD !!!!谢谢你哦!作为一个方面说明:你必须设置这个属性之前,你打开连接,否则它工作!也许将它添加到您的文章,请为未来的读者!再次感谢你!丹科!古拉爵!格拉西亚斯!无论你的语言是什么! – sharkyenergy 2013-03-05 11:50:15
@Justme:感谢您的反馈,我已将此信息添加到答案中。 - 顺便说一句。我通过检查源代码http://www.opensource.apple.com/source/CFNetwork/CFNetwork-128/FTP/CFFTPStream.c来解决这个问题。 – 2013-03-05 12:01:43
设置kCFStreamPropertyFTPAttemptPersistentConnection到kCFBooleanFalse没有关闭我的挥之不去的连接,直到我还设置这个(也开启之前):
[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(id)kCFStreamPropertyShouldCloseNativeSocket];
hiya!你能和我联系吗?我的地址是sharkyenergy X Hotmail dot com(用@替换X) – sharkyenergy 2013-04-25 15:37:27
'[self.networkStream关闭]'应关闭连接。你使用哪个ftp服务器? – 2013-03-03 17:51:35
我在网络中的另一台电脑上使用filezilla。如果我关闭连接,然后重新打开一个新文件的流,那么它不会再次发送用户名和密码。它会刚刚开始上传文件。如果连接已关闭,则应重新记录... streamstatus正在返回6,这意味着它已关闭。但是,只要我关闭程序或超时,FTP就会断开连接。也许我不得不dealloc流,但与ARC启用我得到一个错误。 – sharkyenergy 2013-03-03 17:54:57
我不确定您是否可以重新使用相同的'self.networkStream'作为新连接,我假设您必须创建一个新连接。但这并不能解释关闭超时。 - (我不能测试这个,因为我有一台Mac和Filezilla Server似乎只有Windows。) – 2013-03-03 18:06:16