关于libcurl的文章网络上很多, 这里不再描述. 以下是如何使用libcurl的例子.

 
一、常用函数
    1) libcurl的全局初始化及释放
  1. CURLcode curl_global_init(long flags)
                flags: CURL_GLOBAL_ALL     //初始化所有的可能的调用。
                       CURL_GLOBAL_SSL     //初始化支持 安全套接字层。
                       CURL_GLOBAL_WIN32   //初始化win32套接字库。
                       CURL_GLOBAL_NOTHING //没有额外的初始化。
  1. void     curl_global_cleanup(void)
      应该在程序开始时调用初始化函数. 虽然不调用这个初始化函数, libcurl会在curl_easy_init()函数中自动调用. 但在多线程处理时, 可能会出现多次自动调用的情况.
 
    2) 初始化下载handle及释放
  1. CURL *curl = curl_easy_init();
  2. curl_easy_cleanup(curl);
    3) 设置下载属性. 及常用参数. 
  1. CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
       
      1. 设置下载数据的回调函数.      
  1. option:
  2. CURLOPT_WRITEFUNCTION //设置回调函数
         回调函数原型为: size_t function( void *ptr, size_t size, size_t nmemb, void *userp);           函数将在libcurl接收到数据后被调用。
         void *ptr是下载回来的数据.
         void *userp是用户指针, 用户通过这个指针传输自己的数据.
  1. CURLOPT_WRITEDATA
  2.       设置回调函数中的void *userp指针的来源。
      2. 下载进度控制.
  1. option:
  2. CURLOPT_NOPROGRESS
  3. 为了使CURLOPT_PROGRESSFUNCTION被调用. CURLOPT_NOPROGRESS必须被设置为false.
  4. CURLOPT_PROGRESSFUNCTION
  5. CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次.
  6. CURLOPT_PROGRESSDATA
  7. CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的参数.
  8. 整个处理与下载数据回调的处理相同.
  9. 3. 其它常用属性. 
         option:
  10. CURLOPT_URL
  11. 设置访问的URI.
  12. CURLOPT_NOSIGNAL
  13. 屏蔽其它信号.
  14. CURLOPT_HEADER
  15. 取数据时连同HTTP头部一起取回.
  16. CURLOPT_HEADERFUNCTION
  17. CURLOPT_HEADERDATA
  18. 只取HTTP头部数据, 处理与下载数据回调的处理相同.
  19. CURLOPT_TIMEOUT
  20. 超时时间.
  21. CURLOPT_CONNECTIONTIMEOUT
  22. 连接等待时间.
  23. CURLOPT_FOLLOWLOCATION
  24.      设置支持302重定向
  25.    CURLOPT_RANGE
  26.   断点续传, 指定传输分片, 格式:"0-200"
    4) 开始下载
  1. CURLcode curl_easy_perform(CURL *handle);
 
二、例程
    获取网站包括HTTP头部信息在内的500字节数据.
  1. size_t callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp)
 {
    strcat( userp, ptr);
    return size * nmemb;     //必须返回这个大小, 否则只回调一次, 不清楚为何.
 }
 
 void *get_head_thread(void *)
 {
    CURL *curl = curl_easy_init();
    
    curl_easy_setopt(curl, CURLOPT_URL, "www.163.com"); //设置下载的URI
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20);        //设置超时
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);        //屏蔽其它信号
    curl_easy_setopt(curl, CURLOPT_HEADER, 1);          //下载数据包括HTTP头部
    curl_easy_setopt(curl, CURLOPT_RANGE, "0-500");     //用于断点续传, 设置下载的分片
    
    char buffer[MAXHEADLEN] = {0x0};
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_get_head); //设置下载数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);  
 
    curl_easy_perform(curl);  
    curl_easy_cleanup(curl);
 
    //此时网站HTTP头信息已经存放在buffer内.
 }
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 使用的更多相关文章

  1. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

  2. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)

    1.  利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...

  3. 用libcurl 登录网站

    libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...

  4. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  5. 错误解决: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 ...

  6. 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a

    把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...

  7. 安装zabbix报错configure: error: libcurl library not found

    libcurl 和libcurl-devel都已经安装 且大于7.13.1 但还是报错,这时需要在configure 指定curl路径即可 ./configure --prefix=/usr/loca ...

  8. libcurl教程

    名称 libcurl 的编程教程 目标 本文档介绍使用libcurl编程的一般原则和一些基本方法.本文主要是介绍 c 语言的调用接口,同时也可能很好的适用于其他类 c 语言的接口. 跨平台的可移植代码 ...

  9. Libcurl多线程crash问题(cento)

    cento :http://blog.csdn.net/delphiwcdj/article/details/18284429 1 问题背景 后台系统有一个单线程的http接口,为了提高并发处理能力, ...

  10. libcurl 函数curl_easy_perform在release下崩溃的问题

    今天遇到一个很奇怪的问题: 工程中用到了libcurl, debug可以正常运行,release每次都崩溃,断到curl_easy_perform这一行.堆栈中也得不到有用信息,于是GOOGLE一番, ...

随机推荐

  1. 51nod 1812 树的双直径 题解【树形DP】【贪心】

    老了-稍微麻烦一点的树形DP都想不到了. 题目描述 给定一棵树,边权是整数 \(c_i\) ,找出两条不相交的链(没有公共点),使得链长的乘积最大(链长定义为这条链上所有边的权值之和,如果这条链只有 ...

  2. 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)

    solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...

  3. 限制USB延迟启动

    阻止用户从未经授权的位置安装设备驱动程序. 组策略 ...too long too see directly. what determins when a drivers i s  load. spe ...

  4. 第九次 Scrum Meeting

    第九次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/4/14 19:00 60min 新主楼F座2F 附Github仓库:WEDO 例会照片 工作情况总结(4.14) ...

  5. Idea maven编译报错 javacTask: 源发行版 1.8 需要目标发行版 1.8

    javacTask: 源发行版 1.8 需要目标发行版 1.8 [INFO] ------------------------------------------------------------- ...

  6. mojing手柄遥杆控制

    using UnityEngine; using UnityEngine.UI; using System.Collections; using MojingSample.CrossPlatformI ...

  7. 一些学习比较好的网站,及es6学习好网站,前端用的相关库,及知道的插件

    图形可视化:d3js  echarts https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects ...

  8. DBCP连接池工具类模板

    package ${enclosing_package}; import java.io.InputStream; import java.sql.Connection; import java.sq ...

  9. 【随笔】Linux主机简单判断CC攻击的命令

    今天看到一个很有意思的命令tcpdump,在这里记录下. 如果想要看tcpdump的详细用法,可以点击这里. 什么是CC攻击? 关于CC攻击,这里引用百度的解释: CC攻击的原理就是攻击者控制某些主机 ...

  10. TCP连接管理(TCP Connection Management)

    在最近的求职面试过程中,关于"建立TCP连接的三次握手"不止一次被问到了,虽然我以前用同样的问题面试过别人,但感觉还是不能给面试官一个很清晰的回答.本文算是对整个TCP连接管理做一 ...