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 Attempt Persistent Connection 設定およびコピー操作用のストリーム プロパティ キー。kCFBooleanTrue既存のサーバー接続の再利用を有効にするには、このプロパティを に設定します。このプロパティを に設定して、kCFBooleanFalse既存のサーバー接続を再利用しないようにします。デフォルトでは、このプロパティは に設定されてい kCFBooleanTrueます。

于 2013-03-05T06:37:35.070 に答える