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);// 设置连接超时时间,单位scurl_easy_setopt(curl, CURLOPT_TIMEOUT, 120);// 设置下载超时时间,单位scurl_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();// 初始化curlresult = 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超时时间也要根据下载资源更改为合适的大小。