ios - FTPKit 中止(取消)FTP 操作

标签 ios c ftp

我正在尝试为 iOS 使用这个 Github 库: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 方法的方法

有没有人看到我在这里做错了什么?

最佳答案

我也在使用 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 类的属性的评论中采纳了您的建议。

关于ios - FTPKit 中止(取消)FTP 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43284819/

相关文章:

ios - 扩展 iOS 11 安全区域以包括键盘

ios - pod lint 编译我的 swift 代码而不考虑 #define

mysql - 循环遍历数据库表并比较用户输入

c++ - 在异步模式下使用 FtpFindFirstFile unicode 版本的访问冲突

PHP ftp_chdir - 无法屏蔽错误

ios - 来自 .xib 文件的自定义 UITableViewCell

ios - 记录方法正在哪个队列/线程上运行

c - 代码中制作 head 和 n 有什么区别

c - 使用 -O 标志编译时套接字代码失败

java - 从PLSQL调用JAVA FTP程序