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一番, ...
随机推荐
- DFS-20190206
找出所有方案 排列和组合问题 排列: https://www.lintcode.com/problem/combination-sum/description public class Solutio ...
- js的跨域问题和解决办法
我们在开发中,经常会遇到跨域请求数据问题,那么什么是跨域呢?跨域就是js在不用域之间的数据传输或者通信,比如你在使用ajax从另外一个域请求数据,或者你的页面引入了iframe,要从iframe中获取 ...
- linux忘记root密码怎么办
如何找回root密码,如果我们不小心,忘记root密码,怎么找回? 思路:进入到单用户模式,然后修改root密码.因为进入单用户模式,root不需要密码就可以登录. 详细过程: 1.打开虚拟机 2.开 ...
- 20190430-screen、client、offset、scroll等JS中各种宽度距离
参考文献: JavaScript概念之screen/client/offset/scroll/inner/avail的width/left
- ifconfig command not found
CentOS minimal 命令做了修改 可以运行 ip addr
- 在W3C SCHOOL网站上发现一个关于Schema的错误
原地址是http://www.w3school.com.cn/schema/schema_complex_empty.asp 下面这个例子是不正确的 xmlspy报错. 因为<xs:restri ...
- orcale 之函数
我们知道存储过程的调用是一条 PL/SQL 语句.那么对于一些表达式我们用什么呢?这里函数的功能就会体现出来了. 函数和过程在创建方式上有很多的类似地方,也是编译后放入内存中以供用户使用,只不过函数调 ...
- 鹅厂优文|主播pk,如何实现无缝切换?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文作者,rexchang(常青),腾讯视频云终端技术总监,2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手 ...
- [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...
- 一:Linux知识整理
一.文件系统的管理 tips:输入命令的时候要常用tab键来补全 ls 查看目录信息 ( ls / ) ls -l 等价于 ll pwd 查看当前所处的路径 cd 切换目录 (cd /) ,如果不带参 ...