当前位置: 技术问答>linux和unix
解决问题者40分奉上(文件下载问题)
来源: 互联网 发布时间:2016-09-27
本文导语: 我用libcurl库写了一个文件下载的程序,关于处理文件下载的选项如下: FILE* fd_rec = fopen("123","w"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fd_rec); 其中write...
我用libcurl库写了一个文件下载的程序,关于处理文件下载的选项如下:
其中write_data的函数定义如下:
其他的这里就省略掉了, 现在可以正常下载文件了,不过我现在想实现在下载的过程中可以停止下载,该怎么实现啊?
FILE* fd_rec = fopen("123","w");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fd_rec);
其中write_data的函数定义如下:
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
size_t retcode;
retcode = fwrite(ptr, size, nmemb, (FILE *)stream);
// fprintf(stderr, "*** We write %d bytes from filen", retcode);
return retcode;
}
其他的这里就省略掉了, 现在可以正常下载文件了,不过我现在想实现在下载的过程中可以停止下载,该怎么实现啊?
|
要终止libcurl的连接方法除了上面说的外,还可以用如下方法实现:
1、在回调函数中终止,要由用户控制的话,还是需要类似的全局变量和多线程。
2、冒充Server发送一个FIN分节给Client端。这个实现起来非常麻烦
1、在回调函数中终止,要由用户控制的话,还是需要类似的全局变量和多线程。
2、冒充Server发送一个FIN分节给Client端。这个实现起来非常麻烦
|
在回调函数中返回一个不等于(size * nmemb)的值,就会使得libcurl终止操作,并返回一个错误代码。
|
补充一下,代码可以这样写:
myerrno是你自己定义的错误代码号,用于区分你自己终止传输还是确实系统写出错了。
if (continue==0) {
myerrno=-123;
return (size*nmemb+1);
}
myerrno是你自己定义的错误代码号,用于区分你自己终止传输还是确实系统写出错了。