最近想把某網站上的些數據download下來,在網上找到了cURL,正好來邊學邊弄一下!
cURL的官網是http://curl.haxx.se/ ,直接下載源代碼包來編譯吧 ,在download裡面有源代碼下在,最新版是curl-7.32.0(http://curl.haxx.se/download/curl-7.32.0.tar.gz)。
libcurl是開源的url傳輸庫,支持 FTP、HTTP等協議。我用C語言來實現。curl的接口有很多,目前libcurl-easy接口的功能就足夠強大,夠完成我的要求了,所以這裡就研究下libcurl-easy裡的函數就行了,其他的以後用到在研究。
一般curl的使用流程:
curl_easy_init(); curl_easy_setopt(); curl_easy_perform(); curl_easy_cleanu p();
<culr/curl.h>中的部分函數:
、 CURLcode curl_global_init( flags);
該函數必須在調用其他curl函數之前調用。只需調用一次,調用多次和一次一樣。
該函數是非線程安全的,所以不可以在它運行時,在其他線程調用它。
如果在使用curl_easy_init()函數之前未調用curl_global_init()函數,程序將自動調用。
參數:
CURL_GLOBAL_ALL 初始化除CURL_GLOBAL_ACK_EINTR外的所有系統。
CURL_GLOBAL_SSL 初始化SSL
CURL_GLOBAL_WIN32 初始化Win32 socket libraries.
CURL_GLOBAL_NOTHING 不初始化任何系統
CURL_GLOBAL_DEFAULT 等同於CURL_GLOBAL_ALL
CURL_GLOBAL_ACK_EINTR 設置了這個標簽後,當curl在連接或等待數據請求時,curl將接收EINTR條件,否則,curl會一直等待。
返回值:
正常通過時返回0,非零值表示出現錯誤。
、 curl_global_cleanup();
該函數釋放由curl_global_init()函數請求的資源。
該函數必須在curl_global_init()函數之後調用,關閉curl庫之前必須調用。
該函數也是非線程安全的。
、CURL *curl_easy_init( );
該函數初始化生成一個curl的指針,該指針用做其他easy函數的輸入。
該函數必須和curl_easy_clean()函數一起使用。
如果在調用該函數之前,你沒有調用curl_global_init()進行初始化,系統將會自動調用curl_global_init()函數。
但建議你最好不用讓系統自動調用該函數,因為可能會忘了調用curl_global_cleanup(),而出現問題。
所以最好手動調用curl_global_init()函數。
返回值:
返回一類似FILE的指針,如果返回NULL,則發生錯誤。
、 curl_easy_cleanup(CURL * handle );
調用該函數來結束一個curl easy會話。關閉一個由curl_easy_init()生成的handle。
、CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
為“easy”句柄設置一個行為。
curl_easy_setopt()函數告訴libcurl該如何做。通過設置適當的參數,你可以改變libcurl的行為。
基本所有的操作都是通過這個函數設置的。
option參數是一系列的行為操作。
parameter取決於option參數的設置。
返回值:
0或CURL_OK表示成功。非零值表示有錯誤發生。
如果你設置了一個libcurl無法識別的行為,可能是libcurl版本過低,則將會返回 CURLE_FAILED_INIT。
、CURLcode curl_easy_perform(CURL * handle);
執行會話的操作。
該函數在curl_easy_init()函數和所有的curl_easy_setopt()函數設置完後調用,執行所有設置的操作。
返回值:
成功則返回0,返回non-zero則失敗。如果在curl_easy_setopt()函數中設置了 CURLOPT_ERRORBUFFER ,則當返回non-zero時,在error buffer中會有可讀的錯誤信息。
、CURL *curl_easy_duphandle(CURL *handle);
克隆一個curl會話句柄。
該函數將返回一個curl副本,擁有之前句柄的所有設置。
新的curl句柄也必須在關閉時調用curl_easy_cleanup()函數。
新生成的副本不會繼承任何狀態信息,沒有連接,沒有SSL,沒有cookies。
返回值:
如果返回NULL,則表示克隆失敗。
、 *curl_easy_escape( CURL * curl , * url , length);
URL編碼給定的字符串。
該程序將輸入的字符串轉化為一個URL編碼字符串,返回一個新生成的字符串。
除了a-z, A-Z, 0-9, '-', '.', '_' or '~'字符外,其他字符都轉為轉義字符形式。
如果length參數設為0,將自動調用strlen()函數計算url的長度作為參數。
必須用curl_free()函數來釋放字符串內存。
返回值:
一個指向字符串結尾的指針或者NULL表示轉化失敗。
、 *curl_easy_unescape( CURL * curl , * url , inlength , * outlength);
URL解碼給定的字符串。
所有輸入的URL編碼都轉化成他們相對應的二進制碼。
如果inlength參數設為0,將自動調用strlen()函數計算url的長度作為參數。
如果outlength參數為non-NULL,函數將寫入返回字符串的長度。
返回值:
一個指向字符串結尾的指針或者NULL表示轉化失敗。
、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
用來獲取curl句柄的信息。
、CURLcode curl_easy_pause(CURL *handle , bitmask);
暫停或者啟動一個連接。
一個連接可以同過調用這個函數或者讓讀或寫操作的回調函數返回 CURL_READFUNC_PAUSE 或 CURL_WRITEFUNC_PAUSE 來暫停連接。
handle參數指向要暫停的會話。
bitmask參數設置了連接的新狀態。如下可選:
CURLPAUSE_RECV
停止接收數據。該會話將不會在接收數據,直到再次調用沒有改位狀態的該函數。
CURLPAUSE_SEND
停止發送數據。該會話將不會在發送數據,直到再次調用沒有改位狀態的該函數。
CURLPAUSE_ALL
停止會話的發送和接收。
CURLPAUSE_CONT
重啟會話的發送和接收。
、CURLcode curl_easy_recv( CURL * curl , * buffer , size_t buflen , size_t * n);
通過一個"easy"連接接收數據。
該函數通過建立的連接接收數據。可以和curl_easy_send()函數一起使用,通過libcurl庫實現自定義的協議。
buffer指向你要存儲接收到的數據的地址。buflen是你可以從緩存中獲取的數據的最大值,n將接收你所接收的數據的長度。
如果通過設置 CURLOPT_CONNECT_ONLY 建立起連接,curl_easy_recv()函數將無法調用。
在調用curl_easy_recv()函數之前,必須確定socket有數據可讀,否則將會返回 CURLE_AGAIN 。
通過調用curl_easy_getinfo()函數,並設置參數為 CURLINFO_LASTSOCKET 來獲取socket。
可通過系統工具 select() 檢查是否有數據可讀。
返回值:
如果成功,則返回 CURLE_OK,獲得的數據將存入buffer中,而數據的大小將存入n中。
如果失敗,返回占用錯誤代碼。
如果沒有數據可讀,將返回 CURLE_AGAIN 。
如果沒有可用的socket,將返回 CURLE_UNSUPPORTED_PROTOCOL。
、CURLcode curl_easy_send( CURL * curl , const void * buffer , size_t buflen , size_t * n);
通過一個"easy"連接發送數據。
該函數通過建立的連接發送任意數據。可以和curl_easy_recv()函數一起使用,通過libcurl庫實現自定義的協議。
buffer指向你要發送的數據的地址。buflen是發送的數據的長度,n將接收你所發送的數據的長度。
如果通過設置 CURLOPT_CONNECT_ONLY 建立起連接,curl_easy_recv()函數將無法調用。
在調用curl_easy_send()函數之前,必須確定socket有數據可讀,否則將會返回 CURLE_AGAIN 。
通過調用curl_easy_getinfo()函數,並設置參數為 CURLINFO_LASTSOCKET 來獲取socket。
可通過系統工具 select() 檢查是否有數據可讀。
返回值:
如果成功,則返回 CURLE_OK,實際發送的數據的大小將存入n中。
如果失敗,返回占用錯誤代碼。
如果沒有可用的socket,將返回 CURLE_UNSUPPORTED_PROTOCOL。
、 curl_easy_reset(CURL *handle);
重設一個curl句柄。
重初始化一個curl句柄,使其和剛調用curl_easy_init()函數時一樣。
無法改變句柄中的以下信息:活動中的連接,Session ID cache,DNS cache,cookies 和 share。
、 *curl_easy_strerror(CURLcode errornum);
該函數通過errornum參數,返回剛發生的錯誤信息的字符串。
、 curl_free( * ptr );
釋放內存。