2017-04-07 16 views
0

https://github.com/PeqNP/FTPKitFTPKit中止(キャンセル)FTP操作

問題があるが、私は必要なものである要求する機能を解除一切ありません。特にこのファイルではEXC_BAD_ACCESS

:「不正なファイルディスクリプタの書き込み:」:私はそれがでクラッシュしたとしてしかし、それは動作しません。私自身のキャンセル機能を実装しようとしていますhttps://github.com/PeqNP/FTPKit/blob/master/Libraries/include/ftplib/src/ftplib.c

私は、このメソッドを追加したすべてのFTPサーバーが使用できる "ABOR"コマンドを使用することができます。しかし、これが正しい実装方法であるかどうかはわかりません。

GLOBALDEF void FtpAbort(netbuf *nControl) 
{ 
    if (nControl->dir != FTPLIB_CONTROL) 
     return; 
    FtpSendCmd("ABOR",'2', nControl); 
    net_close(nControl->handle); 
    free(nControl->buf); 
    free(nControl); 
} 

はその後FTPClient.mに、私はちょうどオブジェクト*のnetbufでこのFtpAbortメソッドを呼び出す方法を作った(など、接続をアップロードし、リストすることができ、ダウンロード...)

は誰もい私がここで間違っていることを見ますか?

答えて

1

私はFTPKitも使用していますし、キャンセル機能も必要です。私はあなたのアプローチの主な問題は、あなたのFtpAbort()関数でコントロールバッファを閉じたり、割り当てを解除したりすることだと思います。 libFtp.cのFtpXfer()関数を見ると、解放したのと同じバッファにアクセスしようとします。

私のアプローチは、次のように単にFTPClient.mにメソッドを追加しました:

- (BOOL)cancelOperation { 
    if (self.conn == NULL) 
     return NO; 
    NSString *command = [NSString stringWithFormat:@"ABOR"]; 
    BOOL success = [self sendCommand:command conn:self.conn]; 
    NSString *response = [NSString stringWithCString:FtpLastResponse(self.conn) encoding:NSUTF8StringEncoding]; 

    if (!success) { 
     self.lastError = [NSError FTPKitErrorWithResponse:response]; 
     return NO; 
    } 
    return YES; 
} 

ここでの目標は、ftplibので検出されるべきデータ接続を閉じるようにFTPサーバーを伝えることである - これは意志、理論的には、適切に終了する。これにより、FTPClientのdownloadHandle()メソッドは、クラッシュを避けるべきQUITコマンドを送信することで終了します。

実際には、FTPサーバーがタイムアウトして接続全体を閉じるまで、FtpXfer()がこれを見つけられないように見えるため、「理論的に」と言います。私のサーバーは非常に迅速なタイムアウト(5秒)を持っているので、これは「十分に良い」です。当然のことながら、よりよい解決策を用意することは良いことです。

私はFTPKitのGitHubで作成したコメントから、netfbuf * connをFTPClientクラスのプロパティにすることについて提案しました。

+0

お返事ありがとうございます。私は間違いなく、このアプローチをテストするために少し時間が必要ですが、今後1〜2週間で私は間違いなくこれを実装し、どのように動作するか見ていきます。 –

関連する問題