FTPKit中止(取消)FTP操作

时间:2017-04-07 18:24:59

标签: ios c ftp

我正在尝试将这个Github库用于iOS:https://github.com/PeqNP/FTPKit

问题是,对于我需要的请求没有取消功能。我正在尝试实现我自己的取消功能,但它不起作用,因为它崩溃了:“写:错误的文件描述符”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 个答案:

答案 0 :(得分: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命令来完成,该命令应该避免崩溃。

我说"理论上"因为在实践中,似乎FtpXfer()在我的FTP服务器超时并关闭整个连接之前没有发现这一点。我的服务器有一个非常快的超时(5秒)所以这是#34;足够好"。虽然获得批准,但最好有更好的解决方案。

我从您在FTPKit的GitHub上发表的评论中提出了关于使netfbuf * conn成为FTPClient类属性的建议。