【问题标题】:FTPKit Abort (Cancel) FTP OperationFTPKit 中止(取消) FTP 操作
【发布时间】:2017-07-17 20:44:38
【问题描述】:

我正在尝试将这个 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 方法的方法。

有人看到我在这里做错了吗?

【问题讨论】:

    标签: ios c ftp


    【解决方案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 秒),所以这“足够好”。虽然被允许,但如果有更好的解决方案会很好。

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

    【讨论】:

    • 感谢您的回复。我肯定需要一点时间来测试这种方法,但在接下来的一两周内,我肯定会实施它并看看它是如何工作的。
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多