Linux C语言通过curl下载https资源

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超时时间也要根据下载资源更改为合适的大小。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值