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
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,指定你希望開始傳遞的偏移量。
沒有留言:
張貼留言