我正在尝试为 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/