2017-04-07 29 views
0

我想使用的iOS這個Github上庫: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; 
} 

這裏的目標是告訴FTP服務器關閉應由FTPLIB被檢測到的數據連接 - 這會,理論上,退出正常。這將允許FTPClient中的downloadHandle()方法通過發送應避免崩潰的QUIT命令完成。

我說「理論上」,因爲在實踐中,直到我的FTP服務器超時並關閉整個連接,FtpXfer()纔會發現這一點。我的服務器有一個非常快的超時(5秒),所以這是「足夠好」。雖然獲得批准,但最好有一個更好的解決方案。

我從您在FTPKit的GitHub上發表的評論中提出了關於使netfbuf * conn成爲FTPClient類屬性的建議。

+0

感謝您的回覆。我肯定需要一點時間來測試這種方法,但在接下來的一兩週裏,我一定會着手實現這一點,並看看它是如何工作的。 –