程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 初學libcurl(一)

初學libcurl(一)

編輯:關於C語言

最近想把某網站上的些數據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 );

釋放內存。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved