curl庫中curl_easy_setopt函數詳解

#include <curl/curl.h>
CURLcodecurl_easy_setopt(CURL *handle, CURLoption option, parameter);

 

說明:
此函數用來告訴 libcurl 執行什麼樣的動作。該函數有 3 個參數(該函數的可設置選項非常之多):
第 1 個參數 handle 是由 curl_easy_init() 返回的句柄;第 2 個參數是可以設置的選項(CURLoption);第 3 個參數是與第 2 個選項相關聯的參數,這個參數可以是 long 型,也可以是一個函數指針(function pointer),還可以是一個對象的指針 (object pointer),或者是一個 curl_off_t 類型,這些參數類型必須由選項值(CURLoption)來確定。

具體選項說明(分大類和小類,本說明爲個人理解以及對說明手冊的翻譯,根據應用不斷更新說明內容,分類順序不按照說明手冊):

網絡選項(NETWORK OPTIONS):

1. CURLOPT_URL
這個選項後面接實際要處理的 URL ,這個 URL 是一個以 '\0' 結尾的字符串或參數指針(關於這個參數的簡單示例見:http://www.groad.net/bbs/read.php?tid-1641.html)。如果 URL 參數不寫上協議頭(如 "http://" 或者 "ftp:// 等等 ),那麼函數會自己進行猜解所給的主機上用的是哪一種服務協議。假如你給的這個地址是一個不被 支持的協議,那麼在其後執行 curl_easy_perform() 函數或 curl_multi_perform() 函數時, libcurl 將返回錯誤(CURLE_UNSUPPORTED_PROTOCOL)。這個選項是唯一一個必須在 curl_easy_perform() 調用之前就要設置的選項。

2. CURLOPT_POSTFIELDSIZE
該選項要求第 3 個參數 parameter 是一個 void * 指針,它指向一個向 HTTP 服務器 POST 出去的一段數據,這段數據要根據服務器的具體要求填寫。該選項用法參考示例:http://www.groad.net/bbs/read.php?tid-3909.html

3. CURLOPT_WRITEFUNCTION
使用該選項時,要求第 3 個參數中的回調函數必須是下面的函數原型:

size_t function( char *ptr, size_t size, size_t nmemb, void *userdata);


在啓動會話時,一旦檢測到有需要接收的數據時,回調函數被調用。ptr 所指向的數據大小由 size 和 nmemb 的乘積獲得。函數最後需要返回接收數據的大小。如果不使用該函數,那麼接收到的數據會直接打印到終端;使用該函數,那麼接收到的數據保存在 ptr 所執向的區域,可以利用此來保存接收下來的數據。

4. CURLOPT_USERAGENT
該選項要求傳遞一個以 '\0' 結尾的字符串指針,這個字符串用來在向服務器請求時發送 HTTP 頭部中的 User-Agent 信息,有些服務器是需要檢測這個信息的,如果沒有設置 User-Agent,那麼服務器拒絕請求。設置後,可以騙過服務器對此的檢查。

5.  CURLOPT_WRITEDATA

使用該選項時,第 3 個參數作爲用戶數據的指針而傳遞到使用  CURLOPT_WRITEFUNCTION 選項時指定的回調函數中(第 4 個參數)。如果不想用回調函數而保存數據,那麼可以使用 CURLOPT_WRITEDATA 選項,使用該選項時,函數的第 3 個參數必須是個 FILE 指針,函數會將接收到的數據自動的寫到這個 FILE 指針所指向的文件流中。

6. CURLOPT_VERBOSE
在使用該選項且第 3 個參數爲 1 時,curl 庫會顯示詳細的操作信息。這對程序的調試具有極大的幫助。

7. CURLOPT_NOBODY
使用該選項時,若第 3 個參數設爲 1,這樣在輸出中就不會包含主體內容部分。這僅是對在傳輸的所有內容中,含有“頭部”和“主題內容”兩部分的協議而言。如 HTTP(S) 服務器,在這種情況下將會使 libcurl 庫僅發出一個頭部請求。

8. CURLOPT_HEADER
使用該選項時,第 3 個參數設置爲 1,那麼會通知 curl 庫在輸出時要同時包含 "頭部“ 和 "主題內容" 兩個部分。該選項僅是對那些同時包含了”頭部“和”主題內容“這兩部分的協議而言(如 HTTP)。

9. CURLOPT_HEADERFUNCTION
該選項與上面第 3 個選項 CURLOPT_WRITEFUNCTION 類似,只要它一接收到頭部信息時,它就會執行回調函數。需要注意的是,回調函數裏處理的頭部包含了所有收到的響應的頭部信息,而不只是最後一次的響應。如果需要處理其中的一個頭部,那麼自己需要在所收集的頭部信息中進行區分。

10. CURLOPT_WRITEHEADER 和  CURLOPT_HEADERDATA
這兩個選項是同一種意思。它們和第 5 條中的 CURLOPT_WRITEDATA 選項功能一樣,表示在接收到頭部信息並調用回調函數時,給回調函數傳遞第 4 個參數。

11. CURLOPT_INFILESIZE
當向服務器上傳文件時,該選項用來告訴 curl 庫期望上傳的文件的大小。使用該選項時,應該給函數第 3 個參數的應該是個 long 型變量。如果用的是 SCP 傳輸,那麼該選項強制使用 CURLOPT_INFILESIZE_LARGE 。

12. CURLOPT_INFILESIZE_LARGE
該選項和 CURLOPT_INFILESIZE 功能一樣,但是它要求函數的第 3 個參數必須是個 curl_off_t 類型。curl_off_t 爲 int64_t 類型,而 int64_t 定義在 stdint.h 中:

if __WORDSIZE == 64

typedef long int                int64_t;

# else

__extension__

typedef long long int           int64_t;


由上面定義知,一般的,如果是 32 位平臺,它就是 long long 型,表示 64 位的;如果是 64 位平臺,它就是 long 型,也爲 64 位。總之,就是個 64 位的。

13. CURLOPT_QUOTE 和 CURLOPT_POSTQUOTE
這兩個選項的功能類似,它們的共同點都是給 FTP 或 SFTP 傳遞命令。這些命令應該放在 struct slist 鏈表中存儲,使用時需要用 curl_slist_append() 函數將這些命令打包起來,然後一起發送出去。
它們的不同點是:CURLOPT_QUOTE 選項要求命令要在 FTP 傳輸請求之前就要發送到庫,而 CURLOPT_POSTQUOTE 則可以在 FTP 傳輸請求發送完後發送。比如像下面的執行順序是無法達到目的的:

1 . ... ...

2 curl_easy_perform(curl);

3 curl_easy_setopt(curl, CURLOPT_QUOTE, headerlist);

4 curl_easy_perform(curl);

5 ... ...

 

上面假設第 1 條 curl_easy_perform(curl); 語句已經發送了 FTP 傳輸請求,然後再用 CURLOPT_QUOTE 發送命令是錯誤的,這裏應該使用 CURLOPT_POSTQUOTE 選項。使用 CURLOPT_QUOTE 選項需要先用 curl_easy_perform() 函數將其發送,然後再用一次 curl_easy_perform() 發送 FTP 傳輸請求。也就是說需要執行兩次  curl_easy_perform() 函數。而用  CURLOPT_POSTQUOTE 選項則不需要這樣,它只要將選項設置好後,然後只執行一次 curl_easy_perform() 函數即可。

14. CURLOPT_READFUNCTION 和 CURLOPT_READDATA
這兩個選項和上面的  CURLOPT_WRITEFUNCTION 和 CURLOPT_WRITEDATA 類似。在 CURLOPT_READFUNCTION 的回調函數裏,第 1 個參數 ptr 指針用來接收從第 4 個參數傳遞過來的數據(這個參數往往是個文件流指針),而這個參數是使用 CURLOPT_READDATA 選項時傳遞過來的。

15. CURLOPT_UPLOAD
在使用該選項時,第 3 個參數設置爲 1,表示要準備上傳文件。這個參數往往會配合 CURLOPT_READDATA,CURLOPT_INFILESIZE_LARGE,以及 CURLOPT_INFILESIZE 這幾個選項一起用。如果是使用 HTTP 協議,那麼使用 PUT 的方法進行上傳,除非另有指定。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CURLOPT_HEADER:設爲1,則在返回的內容裏包含http header;

CURLOPT_FOLLOWLOCATION:設爲0,則不會自動301,302跳轉;

*CURLOPT_INFILESIZE: 當你上傳一個文件到遠程站點,這個選項告訴PHP你上傳文件的大小。
*CURLOPT_VERBOSE: 如果你想CURL報告每一件意外的事情,設置這個選項爲一個非零值。
*CURLOPT_HEADER: 如果你想把一個頭包含在輸出中,設置這個選項爲一個非零值。
*CURLOPT_NOPROGRESS: 如果你不會PHP爲CURL傳輸顯示一個進程條,設置這個選項爲一個非零值。

 

注意:PHP自動設置這個選項爲非零值,你應該僅僅爲了調試的目的來改變這個選項。

*CURLOPT_NOBODY: 如果你不想在輸出中包含body部分,設置這個選項爲一個非零值。
*CURLOPT_FAILONERROR: 如果你想讓PHP在發生錯誤(HTTP代碼返回大於等於300)時,不顯示,設置這個選項爲一人非零值。默認行爲是返回一個正常頁,忽略代碼。
*CURLOPT_UPLOAD: 如果你想讓PHP爲上傳做準備,設置這個選項爲一個非零值。
*CURLOPT_POST: 如果你想PHP去做一個正規的HTTP POST,設置這個選項爲一個非零值。這個POST是普通的 application/x-www-from-urlencoded 類型,多數被HTML表單使用。
*CURLOPT_FTPLISTONLY: 設置這個選項爲非零值,PHP將列出FTP的目錄名列表。
*CURLOPT_FTPAPPEND: 設置這個選項爲一個非零值,PHP將應用遠程文件代替覆蓋它。
*CURLOPT_NETRC: 設置這個選項爲一個非零值,PHP將在你的 ~./netrc 文件中查找你要建立連接的遠程站點的用戶名及密碼。
*CURLOPT_FOLLOWLOCATION: 設置這個選項爲一個非零值(象 “Location: “)的頭,服務器會把它當做HTTP頭的一部分發送(注意這是遞歸的,PHP將發送形如 “Location: “的頭)。
*CURLOPT_PUT: 設置這個選項爲一個非零值去用HTTP上傳一個文件。要上傳這個文件必須設置CURLOPT_INFILE和CURLOPT_INFILESIZE選項.
*CURLOPT_MUTE: 設置這個選項爲一個非零值,PHP對於CURL函數將完全沉默。
*CURLOPT_TIMEOUT: 設置一個長整形數,作爲最大延續多少秒。
*CURLOPT_LOW_SPEED_LIMIT: 設置一個長整形數,控制傳送多少字節。
*CURLOPT_LOW_SPEED_TIME: 設置一個長整形數,控制多少秒傳送CURLOPT_LOW_SPEED_LIMIT規定的字節數。
*CURLOPT_RESUME_FROM: 傳遞一個包含字節偏移地址的長整形參數,(你想轉移到的開始表單)。
*CURLOPT_SSLVERSION: 傳遞一個包含SSL版本的長參數。默認PHP將被它自己努力的確定,在更多的安全中你必須手工設置。
*CURLOPT_TIMECONDITION: 傳遞一個長參數,指定怎麼處理CURLOPT_TIMEVALUE參數。你可以設置這個參數爲TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。這僅用於HTTP。
*CURLOPT_TIMEVALUE: 傳遞一個從1970-1-1開始到現在的秒數。這個時間將被CURLOPT_TIMEVALUE選項作爲指定值使用,或被默認TIMECOND_IFMODSINCE使用。

下列選項的值將被作爲字符串:

*CURLOPT_URL: 這是你想用PHP取回的URL地址。你也可以在用curl_init()函數初始化時設置這個選項。
*CURLOPT_USERPWD: 傳遞一個形如[username]:[password]風格的字符串,作用PHP去連接。
*CURLOPT_PROXYUSERPWD: 傳遞一個形如[username]:[password] 格式的字符串去連接HTTP代理。
*CURLOPT_RANGE: 傳遞一個你想指定的範圍。它應該是”X-Y”格式,X或Y是被除外的。HTTP傳送同樣支持幾個間隔,用逗句來分隔(X-Y,N-M)。
*CURLOPT_POSTFIELDS: 傳遞一個作爲HTTP “POST”操作的所有數據的字符串。
*CURLOPT_REFERER: 在HTTP請求中包含一個”referer”頭的字符串。
*CURLOPT_USERAGENT: 在HTTP請求中包含一個”user-agent”頭的字符串。
*CURLOPT_FTPPORT: 傳遞一個包含被ftp “POST”指令使用的IP地址。這個POST指令告訴遠程服務器去連接我們指定的IP地址。這個字符串可以是一個IP地址,一個主機名,一個網絡界面名(在UNIX下),或是‘-’(使用系統默認IP地址)。
*CURLOPT_COOKIE: 傳遞一個包含HTTP cookie的頭連接。
*CURLOPT_SSLCERT: 傳遞一個包含PEM格式證書的字符串。
*CURLOPT_SSLCERTPASSWD: 傳遞一個包含使用CURLOPT_SSLCERT證書必需的密碼。
*CURLOPT_COOKIEFILE: 傳遞一個包含cookie數據的文件的名字的字符串。這個cookie文件可以是Netscape格式,或是堆存在文件中的HTTP風格的頭。
*CURLOPT_CUSTOMREQUEST: 當進行HTTP請求時,傳遞一個字符被GET或HEAD使用。爲進行DELETE或其它操作是有益的,更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request.

注意: 在確認你的服務器支持命令先不要去這樣做。

下列的選項要求一個文件描述(通過使用fopen()函數獲得):

*CURLOPT_FILE: 這個文件將是你放置傳送的輸出文件,默認是STDOUT.
*CURLOPT_INFILE: 這個文件是你傳送過來的輸入文件。
*CURLOPT_WRITEHEADER: 這個文件寫有你輸出的頭部分。
*CURLOPT_STDERR: 這個文件寫有錯誤而不是stderr。

 

 

 

幾種選項測試函數:

 

#include <stdio.h>
#include <stdlib.h>

#include <string.h>

#include <curl/curl.h>

#include <curl/easy.h>     

static size_t save_header(void *ptr, size_t size, size_t nmemb, void *data)

{          

fwrite(ptr, size, nmemb, data);         

return (size * nmemb);

}   


int main(void)

{         

char url[] = "http://www.sina.com.cn/";         

CURL *curl;         CURLcode res;             

FILE *fp;         

if (!(fp = fopen("htmheader.html", "w")))

{                 

printf ("fopen error\n");                

return -1;         

}          

curl_global_init(CURL_GLOBAL_ALL);           

curl = curl_easy_init();        

if (curl)

{                

curl_easy_setopt(curl, CURLOPT_URL, url);                

curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);               

curl_easy_setopt(curl, CURLOPT_HEADER, 0L);           

curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, save_header);   

curl_easy_setopt(curl, CURLOPT_WRITEHEADER, fp);               

curl_easy_perform(curl);        

}       

curl_easy_cleanup(curl);  

curl_global_cleanup();          

fclose (fp);        

return 0;

}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章