2012年12月17日 星期一

C 語言 Libcurl 函式庫基本使用

[libcurl 官網]
http://curl.haxx.se/libcurl/c/


[使用libcurl的大概流程]
1. 調用curl_global_init()初始化libcurl
2. 調用curl_easy_init()函數得到easy interface型指針
3. 調用curl_easy_setopt()設置傳輸選項
4. 根據curl_easy_setopt()設置的傳輸選項,實現回調函數以完成用戶特定任務
5. 調用curl_easy_perform()函數完成傳輸任務
6. 調用curl_easy_cleanup()釋放記憶體

Example Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
  
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);  
  
int main() 
{  
    CURL *curl;  
    CURLcode res;  
    FILE *XYZ;  
    struct curl_slist *http_header = NULL;  
  
    if ((XYZ = fopen("log.txt", "w")) == NULL) 
    {  
        printf("File Open Error!!!!\n");
        return 0;
    }  
  
    curl = curl_easy_init();  
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/user_login.php");  
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=test&password=pass1234");  
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);  
    curl_easy_setopt(curl, CURLOPT_POST, 1);  
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);  
    curl_easy_setopt(curl, CURLOPT_HEADER, 1);  
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/a.cookie");  
    res = curl_easy_perform(curl);  
    curl_easy_cleanup(curl);  
}  
  
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) 
{  
    FILE *XYZ = (FILE*)userp;  
    fwrite(buffer, size, nmemb, XYZ);  
}  

setopt 參數說明

[簡單列個上面用到的]
CURLOPT_URL: 目標網址
CURLOPT_POSTFIELDS: POST的東西
CURLOPT_WRITEFUNCTION: 告訴程式要對傳回值要幹嘛
CURLOPT_WRITEDATA: WRITEFUNCTION的第四個參數用,stream來源
CURLOPT_POST: 如果設定成true代表使用POST
CURLOPT_VERBOSE: 如果設定成true就會輸出過程的訊息
CURLOPT_HEADER: 如果設定成true就會把執行過程的訊息傳給WRITEFUNCTION
CURLOPT_FOLLOWLOCATION: 如果設定成true,回應Headre File的Location
CURLOPT_COOKIEFILE: 設置對應的Cookie路徑


[詳細版]
1. CURLOPT_URL
設置訪問URL

2. CURLOPT_WRITEFUNCTION、CURLOPT_WRITEDATA
size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
函數將在libcurl接收到數據後被調用,因此函數多做數據保存的功能,如處理下載文件。
CURLOPT_WRITEDATA用於表明CURLOPT_WRITEFUNCTION函數中的stream指針的來源。
如果你沒有通過CURLOPT_WRITEFUNCTION屬性给easy handle設置回調函數,libcurl會提供一個默認的回調函數,它只是簡單的將接收到的數據印到標准輸出。你也可以通過
CURLOPT_WRITEDATA屬性给默認回調函數傳遞一個已經打開的文件指針,用於將數據輸出到文件裏。

3. CURLOPT_HEADERFUNCTION、CURLOPT_HEADERDATA
size_t function( void *ptr, size_t size,size_t nmemb, void *stream);
libcurl一旦接收到http 頭部數據後將調用該函數。
CURLOPT_WRITEDATA 傳遞指針给libcurl,該指針表明CURLOPT_HEADERFUNCTION 函數的stream指針的來源。

4. CURLOPT_READFUNCTION CURLOPT_READDATA
size_t function(void *ptr, size_t size, size_t nmemb,void *stream);
libCurl需要讀取數據傳遞给遠程主機時將調用CURLOPT_READFUNCTION指定的函數。CURLOPT_READDATA表明CURLOPT_READFUNCTION函數原型中的stream指針來源。

5. CURLOPT_NOPROGRESS、CURLOPT_PROGRESSFUNCTION、CURLOPT_PROGRESSDATA
跟數據傳輸進度相關的参數。CURLOPT_PROGRESSFUNCTION 指定的函數正常情況下每秒被libcurl調用一次,为了使CURLOPT_PROGRESSFUNCTION被調用,CURLOPT_NOPROGRESS必須被設置为false,CURLOPT_PROGRESSDATA指定的参數將作为CURLOPT_PROGRESSFUNCTION指定函數的第一個参數

6. CURLOPT_TIMEOUT、CURLOPT_CONNECTIONTIMEOUT:
CURLOPT_TIMEOUT 由於設置傳輸時間
CURLOPT_CONNECTIONTIMEOUT 設置連接等待時間。

7. CURLOPT_FOLLOWLOCATION
設置重定位URL

8. CURLOPT_RANGE: CURLOPT_RESUME_FROM:
斷點續傳相關設置。CURLOPT_RANGE 指定char *参數傳遞给libcurl,用於指明http域的RANGE頭域,例如:
表示頭500個字節:bytes=0-499
表示第二個500字節:bytes=500-999
表示最後500個字節:bytes=-500
表示500字節以後的範圍:bytes=500-
第一個和最後一個字節:bytes=0-0,-1
同時指定幾個範圍:bytes=500-600,601-999
CURLOPT_RESUME_FROM 傳遞一個long参數给libcurl,指定你希望開始傳遞的偏移量。


沒有留言:

張貼留言