当前位置: 首页 > news >正文

今天哈尔滨最新通告/杭州优化外包

今天哈尔滨最新通告,杭州优化外包,如何将wordpress上传,it人力外包服务文章目录1. 概述2. 实现3. 参考1. 概述 我在博文《curl使用小记(二)——远程下载一张图片》中介绍了如何通过Curl获取远端的文件。不过在那个例子中,将获取远端数据与写入数据的步骤混杂到一起了。在多线程的场景下,这样做可能会造成读写冲突的问题。理…

文章目录

  • 1. 概述
  • 2. 实现
  • 3. 参考

1. 概述

我在博文《curl使用小记(二)——远程下载一张图片》中介绍了如何通过Curl获取远端的文件。不过在那个例子中,将获取远端数据与写入数据的步骤混杂到一起了。在多线程的场景下,这样做可能会造成读写冲突的问题。理论上,远端访问数据是先保存到内存中,在写出到文件中。而远端访问数据到内存可以看作是读操作,是不会读冲突的。所以一个很好的策略是,一次性将数据读取到内存Buf中,再写出到文件。

2. 实现

将《curl使用小记(二)——远程下载一张图片》中的代码改进一下,具体的代码实例如下:

#include <iostream>
#include <curl/curl.h>using namespace std;//内存块结构体
struct MemoryStruct
{char *memory;size_t size;MemoryStruct(){memory = (char *)malloc(1);size = 0;}~MemoryStruct(){free(memory);memory = NULL;}
};//回调函数实现:一次请求可能多次调回调函数
size_t HttpPostWriteBack(void *contents, size_t size, size_t nmemb, void *userp)
{size_t realsize = size * nmemb;//一次回调返回的数据量struct MemoryStruct *mem = (struct MemoryStruct *)userp;char *ptr = (char *)realloc(mem->memory, mem->size + realsize);if (ptr == NULL){printf("not enough memory (realloc returned NULL)\n");return 0;}mem->memory = ptr;memcpy(&(mem->memory[mem->size]), contents, realsize);mem->size += realsize;return realsize;//必须返回真实的数据
}int main()
{const char *netlink = "http://cn.bing.com/th?id=OHR.GrandsCausses_EN-CN3335882379_800x480.jpg";const char *output = "D:/dst1.jpg";curl_global_init(CURL_GLOBAL_ALL);		//初始化全局资源CURL *curl = curl_easy_init();		//初始化句柄//需要的话,可以设置代理//curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:7890");//访问网址curl_easy_setopt(curl, CURLOPT_URL, netlink);//设置用户代理curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36");//获取数据MemoryStruct chunk;	curl_easy_setopt(curl, CURLOPT_WRITEDATA, &chunk);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpPostWriteBack);实现下载进度//curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);//curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);//curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, nullptr);//运行curl_easy_perform(curl);curl_easy_cleanup(curl);			//释放句柄curl_global_cleanup(); //释放全局资源//写出数据FILE *fp = nullptr;if (fopen_s(&fp, output, "wb") != 0){curl_easy_cleanup(curl);return 0;}fwrite(chunk.memory, chunk.size, 1, fp);fclose(fp);return 1;
}    

这段代码其中一个关键改进在于,通过自定义结构体MemoryStruct,实现了一个类似于动态数组的设计。由于远端访问文件的数据量在一开始并不能确定,所以需要先访问一部分,然后将容器扩容,再访问一部分,再扩容。这个申请内存的扩容操作是通过C的realloc()函数来实现的。这个结构体MemoryStruct还利用了C++的RAII机制做内存管理。

另外一个关键就是CURLOPT_WRITEDATA于CURLOPT_WRITEFUNCTION的配合使用了。CURLOPT_WRITEFUNCTION用来设置回调函数,CURLOPT_WRITEDATA用来设置回调函数的出参,这个其实是C的编程思维,万物皆指针,所有的操作都被抽象成同一个函数接口,其实不是同一个东西。

3. 参考

  1. curl CURLOPT_WRITEDATA CURLOPT_WRITEFUNCTION 回调函数
  2. libcurl中CURLOPT_WRITEFUNCTION设置回调函数
http://www.lbrq.cn/news/1071235.html

相关文章:

  • 网站应如何设计/seo外链增加
  • 网站可以用视频做背景吗/程序员培训机构排名前十
  • 芍药居做网站公司/网络推广的优势有哪些
  • 做淘宝差不多的网站/汕头seo外包公司
  • wordpress better wordpress minify/网站内部优化有哪些内容
  • 初中做历史的网站/媒体网络推广价格优惠
  • wordpress 移植/seo竞争对手分析
  • 万盛经开区规划建设局网站/郑州网站关键词排名技术代理
  • 沈阳网站设计定制网站建设/程序员培训班要多少钱
  • 张家港做网站的公司/短期职业技能培训班
  • 电子商务网站流程图/搜索引擎优化大致包含哪些内容或环节
  • 泉州厦门网站建设公司/重庆seo技术分享
  • 武汉市网站建设公司/成人就业技术培训机构
  • 深圳企业网站推广/磁力天堂最佳搜索引擎入口
  • 公众号制作教程/阿里seo排名优化软件
  • 12380网站建设建议/培训心得总结
  • wordpress自製插件/优化设计答案大全英语
  • 长沙做网站那家好/百度联盟app
  • 编程 给别人做网站/奉化网站关键词优化费用
  • 卫浴网站怎么做/资源平台
  • 使用java做直播网站/seo蜘蛛池
  • 我在学校志愿队做网站的经历/网站设计模板网站
  • 重庆网站建设公司费用/专业网站制作
  • 淮南网站建设/seo推广技巧
  • freeexampaper wordpress/泰安seo公司
  • 网站建设与管理多选题/百度app关键词优化
  • wordpress路径函数/seo的主要分析工具
  • WordPress设置域名出错/seo内容优化心得
  • 骨科医院网站模板/xp优化大师
  • 有没有在淘宝找人做网站被骗过的/搜索引擎优化的主要内容
  • day 44 文件的规范书写与拆分
  • Android 之 MVC架构
  • 【数据结构】哈希表实现
  • SmartCLIP:具有识别保证的模块化视觉-语言对齐
  • Javascript面试题及详细答案150道之(016-030)
  • sqli-labs:Less-18关卡详细解析