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內.
 }


說明: void *get_head_thread(void *), 從函數名就可以看出, 這個函數內部的libcurl操作可以放到多線程進行處理, 唯一要注意的就是libcurl的全局初始化必須放在線程之外. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章