zoukankan      html  css  js  c++  java
  • libcurl 使用

    关于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. 
     ", 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 
    ", curl_easy_strerror(res), url.c_str());
    }
    else
    {
    //qDebug("&&&&&& download succeed. 
    ");
    }
    }
    
    if(NULL != ftpfile.stream)
    {
    //关闭文件流
    fclose(ftpfile.stream);
    }
    
    return 0;
    }
    

      

  • 相关阅读:
    linux 上安装sqlplus
    如何使用 SVN 找到一段时间内提交的代码文件
    nginx 快速检查配置文件的方法
    nginx 报错 [emerg] 1164#1664: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
    nginx 负载均衡
    C#可扩展编程之MEF学习
    5天玩转C#并行和多线程编程
    C#综合揭秘——深入分析委托与事件
    解析C#中[],List,Array,ArrayList的区别及应用
    在easyui datagrid中formatter数据后使用linkbutton
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/8693715.html
Copyright © 2011-2022 走看看