2

我正在使用 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 的情况下做到这一点?

- - 更新 - -

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

4

2 回答 2

3

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

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

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

从文档中:

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

于 2013-03-05T06:37:35.070 回答
1

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

[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(id)kCFStreamPropertyShouldCloseNativeSocket];
于 2013-04-10T22:52:33.367 回答