libcurl使用与例程

转载自:http://blog.chinaunix.net/uid-20692625-id-3203258.html

一、常用函数

1、libcurl的全局初始化及释放:

CURLcode curl_global_init(long flags) 
                flags: CURL_GLOBAL_ALL     //初始化所有的可能的调用。
                       CURL_GLOBAL_SSL     //初始化支持 安全套接字层。
                       CURL_GLOBAL_WIN32   //初始化win32套接字库。
                       CURL_GLOBAL_NOTHING //没有额外的初始化。
     void     curl_global_cleanup(void)
在程序开始时调用初始化函数,虽然不调用这个初始化函数,libcurl会在curl_easy_init()函数中自动调用,但在多线程处理时,可能会出现多次自动调用的情况。

2、初始化下载handle及释放

CURL* curl = curl_easy_init();
curl_easy_cleanup(curl);

3、设置下载属性及常用参数

Curlicued  curl_easy_setopt(CURL*   handle,CURLoption  option,  parameter);
1)设置下载数据的回调函数:option:
CURLOPT_WRITEFUNCTION:设置回调函数
回调函数原型为:size_t   function(void *ptr, size_t   size, size_t   nmemb,  void  *userp);
函数在libcurl接收到数据后被调用
参数1:ptr是下载回来的数据
参数2:size_t每次读取的字节数
参数3:读取的次数
参数4:用户指针,用户通过这个指针传输自己的数据
CURLOPT_WRITEDATA:设置回调函数中的void*  userp指针来源
2)下载进度控制:
CURLOPT_NOPROGRESS:为了使CURLOPT_PROGRESSFUNCTION被调用,CURLOPT_NOPROGRESS必须设置为false;
CURLOPT_PROGRESSDATA:指定的函数正常情况下每秒被libcurl调用一次
CURLOPT_PROGRESSDATA:指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的参数。
整个处理与下载数据回调的处理相同。
3)其它属性
CURLOPT_URL:设置访问的URL
CURLOPT_NOSIGNAL:屏蔽其他信号
CURLOPT_HEADER:取数据时连同HTTP头部一起取回
CURLOPT_HEADERFUNCTION与CURLOPT_HEADERDATA:只取HTTP头部数据,处理与下载数据回调的处理相同
CURLOPT_TIMEOUT:超时时间
CURLOPT_CONNECTIONTIMEOUT:连接等待时间
CURLOPT_FOLLOWLOCATION:支持302重定向
CURLOPT_RANGE:断点续传,指定传输分片,格式“0-200”
4)开始下载:
CURLcode  curl_easy_perform(CURL*  handle);

4、例子

获取网站包括HTTP头部信息在内的500字节数据
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); //设置回调函数userp指针来源 

    curl_easy_perform(curl);  
    curl_easy_cleanup(curl);

    //此时网站HTTP头信息已经存放在buffer内.
 }
说明:void* get_head_thread(void *),这个函数内部的libcurl操作可以放到多线程中进行处理,唯一需要注意的是lib curl的全局初始化必须放在线程之外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值