我正在使用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
?
答案 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];