Linux C语言通过curl下载https资源代码如下,注意需要把main函数 char *url 赋值为需要下载文件的路径。
#include <curl/curl.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
static size_t filesize = 0;
size_t write_data(void *buffer, size_t size, size_t nmemb, void *user_para)
{
size_t wb;
wb = fwrite(buffer, size, nmemb, (FILE *)user_para);
filesize += size * nmemb;
printf("fsize=%d\r\n", filesize);
return wb;//size * nmemb;
}
CURLcode down_file(CURL *curl, char *url, void *para)
{
curl_easy_setopt(curl, CURLOPT_URL, url);// 设置远程主机的url地址
//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);// 设置连接超时时间,单位s
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 120);// 设置下载超时时间,单位s
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);// 设置回调函数来保存接收数据
curl_easy_setopt(curl, CURLOPT_WRITEDATA, para);// 设置回调函数参数
//curl_easy_setopt(curl,CURLOPT_POST,1);
curl_easy_setopt(curl,CURLOPT_VERBOSE,1);// 打开详细信息
return curl_easy_perform(curl);// 请求数据
}
int main(int argc, char *argv[])
{
FILE *fptr;
CURL *curl;
CURLcode result;
char *filename = "./player.mp4";
char *url;// 赋值为需要下载文件的路径
printf("curl version: %s\r\n", curl_version());// 打印curl版本信息
if ((fptr = fopen(filename, "w")) == NULL)// 打开文件
{
printf("fopen file \"%s\" error!\r\n", filename);
return -1;
}
filesize = 0;
curl = curl_easy_init();// 初始化curl
result = down_file(curl, url, fptr);// 下载文件
if (result != CURLE_OK)
{
switch (result)
{
case CURLE_UNSUPPORTED_PROTOCOL:
printf("unsupported protocol!\r\n");
break;
case CURLE_COULDNT_CONNECT:
printf("couldnt connect!\r\n");
break;
case CURLE_HTTP_RETURNED_ERROR:
printf("http returned error!\r\n");
break;
case CURLE_READ_ERROR:
printf("read error!\r\n");
break;
default:
printf("get error! %s\r\n", result);
break;
}
}
printf("result: %d\r\n", result);
curl_easy_cleanup(curl);// 释放curl资源
fclose(fptr);// 关闭文件
return 0;
}
在笔者测试过程中一开始是没有设置 curl_easy_setopt(curl,CURLOPT_VERBOSE,1) 打开详细信息的,下载超时时间设置的也比较短 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10),只有10秒。然后运行程序后出现了以下错误:
刚开始以为是运行程序后内存异常或者多线程操作导致程序挂掉,就开始gdb调试代码了,后面发现用./curl 命令测试下载是没有问题的,应该不是curl的问题。然后查找资料后,打开CURLOPT_VERBOSE输出详细信息,发现是在下载过程中超时导致关闭连接,程序直接关闭掉了。
所以在调试过程中打开CURLOPT_VERBOSE输出信息,可以方便我们发现问题,同时CURLOPT_TIMEOUT超时时间也要根据下载资源更改为合适的大小。