当NSConnection关闭时,不与FTP断开连接

时间:2013-03-03 16:26:54

标签: objective-c cocoa ftp

我正在使用Apple的SimpleFTPSample示例代码的编辑版本,特别是“PUT”部分。其中有这种方法:

- (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

我发现在关闭连接之前,我必须将“QUIT”发送到ftp服务器,以便让他知道我想要断开连接。但是如何实现“QUIT”命令发送到SimpleFTPSample

2 个答案:

答案 0 :(得分:3)

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

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

然后FTP流在关闭时关闭控制和数据连接。

来自文档:

  

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

答案 1 :(得分:1)

将kCFStreamPropertyFTPAttemptPersistentConnection设置为kCFBooleanFalse没有关闭我的延迟连接,直到我也设置了它(也在打开之前):

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