2013-03-03 89 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