2013-03-03 61 views
2

我正在使用苹果公司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

+1

'[self.networkStream关闭]'应关闭连接。你使用哪个ftp服务器? – 2013-03-03 17:51:35

+1

我在网络中的另一台电脑上使用filezilla。如果我关闭连接,然后重新打开一个新文件的流,那么它不会再次发送用户名和密码。它会刚刚开始上传文件。如果连接已关闭,则应重新记录... streamstatus正在返回6,这意味着它已关闭。但是,只要我关闭程序或超时,FTP就会断开连接。也许我不得不dealloc流,但与ARC启用我得到一个错误。 – sharkyenergy 2013-03-03 17:54:57

+1

我不确定您是否可以重新使用相同的'self.networkStream'作为新连接,我假设您必须创建一个新连接。但这并不能解释关闭超时。 - (我不能测试这个,因为我有一台Mac和Filezilla Server似乎只有Windows。) – 2013-03-03 18:06:16

回答

3

之前打开连接,您必须将kCFStreamPropertyFTPAttemptPersistentConnection属性设置为FALSE:

[self.networkStream setProperty:(id)kCFBooleanFalse 
         forKey:(id)kCFStreamPropertyFTPAttemptPersistentConnection]; 

那么FTP流关闭控制和数据连接时,它被关闭。

从文档:

kCFStreamPropertyFTPAttemptPersistentConnection
FTP尝试持久 连接流属性设置键和复制操作。将此 属性设置为kCFBooleanTrue以启用现有服务器 连接的重用;将此属性设置为kCFBooleanFalse以不重用 现有服务器连接。默认情况下,此属性设置为 kCFBooleanTrue

+0

我也在使用Apple的simpleFTPSample。我也遇到与“@Just me”相同的问题,但在我的情况下,由于带宽有时上传速度变慢,然后如果我点击“取消上传”重试,它会崩溃,并进入iPhone主屏幕。 点击“取消上传”时,我在等同于问题中显示的代码。 – Shailesh 2013-03-05 07:02:07

+0

IT WORKEDDDD !!!!谢谢你哦!作为一个方面说明:你必须设置这个属性之前,你打开连接,否则它工作!也许将它添加到您的文章,请为未来的读者!再次感谢你!丹科!古拉爵!格拉西亚斯!无论你的语言是什么! – sharkyenergy 2013-03-05 11:50:15

+1

@Justme:感谢您的反馈,我已将此信息添加到答案中。 - 顺便说一句。我通过检查源代码http://www.opensource.apple.com/source/CFNetwork/CFNetwork-128/FTP/CFFTPStream.c来解决这个问题。 – 2013-03-05 12:01:43

1

设置kCFStreamPropertyFTPAttemptPersistentConnection到kCFBooleanFalse没有关闭我的挥之不去的连接,直到我还设置这个(也开启之前):

[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(id)kCFStreamPropertyShouldCloseNativeSocket]; 
+0

hiya!你能和我联系吗?我的地址是sharkyenergy X Hotmail dot com(用@替换X) – sharkyenergy 2013-04-25 15:37:27