libcurl 使用
关于libcurl的文章网络上很多, 这里不再描述. 以下是如何使用libcurl的例子.
- CURLcode curl_global_init(long flags)
- void curl_global_cleanup(void)
- CURL *curl = curl_easy_init();
- curl_easy_cleanup(curl);
- CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
- option:
- CURLOPT_WRITEFUNCTION //设置回调函数
- CURLOPT_WRITEDATA
- 设置回调函数中的void *userp指针的来源。
- option:
- CURLOPT_NOPROGRESS
- 为了使CURLOPT_PROGRESSFUNCTION被调用. CURLOPT_NOPROGRESS必须被设置为false.
- CURLOPT_PROGRESSFUNCTION
- CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次.
- CURLOPT_PROGRESSDATA
- CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的参数.
- 整个处理与下载数据回调的处理相同.
- 3. 其它常用属性.
option: - CURLOPT_URL
- 设置访问的URI.
- CURLOPT_NOSIGNAL
- 屏蔽其它信号.
- CURLOPT_HEADER
- 取数据时连同HTTP头部一起取回.
- CURLOPT_HEADERFUNCTION
- CURLOPT_HEADERDATA
- 只取HTTP头部数据, 处理与下载数据回调的处理相同.
- CURLOPT_TIMEOUT
- 超时时间.
- CURLOPT_CONNECTIONTIMEOUT
- 连接等待时间.
- CURLOPT_FOLLOWLOCATION
- 设置支持302重定向
- CURLOPT_RANGE
- 断点续传, 指定传输分片, 格式:"0-200"
- CURLcode curl_easy_perform(CURL *handle);
- size_t callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp)
struct FtpFile {
std::string filename;
FILE *stream;
};
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream)
{
out->stream=fopen(out->filename.c_str(), "wb");//打开文件进行写入
if(!out->stream)
{
return -1;
qDebug("&&&&&& write file %s err, open failed. \n ", out->filename.c_str());
}
}
return fwrite(buffer, size, nmemb, out->stream);
}
int Downloader::DownloadFile(string url, string filePath)
{
CURL *curl;
CURLcode res;
struct FtpFile ftpfile={ filePath, NULL };
curl = curl_easy_init(); //初始化一个curl指针
if(curl)
{
//设置远端地址
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
//执行写入文件流操作
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);//当有数据被写入,回调函数被调用,
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); //设置结构体的指针传递给回调函数
//启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_USERPWD, "SUREN:SUREN");
//写入文件
res = curl_easy_perform(curl);
//释放curl对象
curl_easy_cleanup(curl);
if(res != CURLE_OK)
{
qDebug("&&&&&& download failed %s, url: %s \n", curl_easy_strerror(res), url.c_str());
}
else
{
//qDebug("&&&&&& download succeed. \n");
}
}
if(NULL != ftpfile.stream)
{
//关闭文件流
fclose(ftpfile.stream);
}
return 0;
}
libcurl 使用的更多相关文章
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...
- (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)
1. 利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...
- 用libcurl 登录网站
libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
执行以下代码,生成唯一的UID $fp = popen("/xxx/bin/tools/uuidgen system", "r");// $uid = frea ...
- 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a
把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...
- 安装zabbix报错configure: error: libcurl library not found
libcurl 和libcurl-devel都已经安装 且大于7.13.1 但还是报错,这时需要在configure 指定curl路径即可 ./configure --prefix=/usr/loca ...
- libcurl教程
名称 libcurl 的编程教程 目标 本文档介绍使用libcurl编程的一般原则和一些基本方法.本文主要是介绍 c 语言的调用接口,同时也可能很好的适用于其他类 c 语言的接口. 跨平台的可移植代码 ...
- Libcurl多线程crash问题(cento)
cento :http://blog.csdn.net/delphiwcdj/article/details/18284429 1 问题背景 后台系统有一个单线程的http接口,为了提高并发处理能力, ...
- libcurl 函数curl_easy_perform在release下崩溃的问题
今天遇到一个很奇怪的问题: 工程中用到了libcurl, debug可以正常运行,release每次都崩溃,断到curl_easy_perform这一行.堆栈中也得不到有用信息,于是GOOGLE一番, ...
随机推荐
- Vue项目中用的Jquery.js和easing.js做的抛物线
如果项目中还用到自有的$ <script> jQuery.noConflict();</script> //星星掉落movePathNew(args) { let self = ...
- 数组合并去重Array.from
function uniqArr(){ if(arguments.length == 0) return []; var arr = arguments[0]; for(var i=1;i<ar ...
- Ubuntu16.04+Cuda8.0+cuDNN6配置py-faster rcnn(转)
原博客地址:https://blog.csdn.net/meccaendless/article/details/79557162 0前言Faster R-CNN是任少卿2015年底推出的目标检测算法 ...
- C++下遍历文件夹
编写程序遍历文件夹及其子文件夹下所有文件,并输出到标准输出流或者文件流. 1. 先考虑在单层目录下,遍历所有文件.以C:\WINDOWS为例: 用到数据结构_finddata_t,文件信息结构体的指针 ...
- 取消文件与svn服务器的关联
在使用svn项目管理工具的时候,经常遇到这样的情况: 我从svn下载下来了一个版本,后面不在需要和svn进行同步版本管理,但是文件夹的上面总是有一个勾,显示同步状态,强迫症真的受不了. 效果见小图: ...
- 使用ant宏定义任务
基础basic.xml文件 <?xml version="1.0" encoding="UTF-8"?><project> < ...
- Log4J2 配置文件模板及代码说明
Log4j是Apache的著名项目,随着Java应用的越来越广泛,对日志性能等方面的要求也越来越高.Log4j的升级版本Log4j2在前些年发布.Log4J2的优点和好处有很多,可以自行搜索查阅相关文 ...
- unity小地图上的动态图标
unity制作小地图简单,用rawImage 再来个摄像机就行 但是现在一个需求就是地图上一些东西要加上图标,图标会随着地图物体的移动而移动 然后去网上下载了个小地图插件 UGUI MiniMap( ...
- C#使用System.xml.linq来生成XML文件
直接看代码: /* * <?xml version="1.0" encoding="utf-8"?> * <Files Path=" ...
- xmanager连接redhat(centos)
1.以连接Centos6.5为例,先关闭防火墙 service iptables stop chkconfig --level 345 iptables off 2.安装XDM,通过 XDMCP 支持 ...