cURL-04-基於libcurl庫的開發

libcurl是一個簡單易用的基於URL傳輸的客戶端開發庫,支持多種平臺以及三十多種開發語言綁定。libcurl是線程安全的,兼容IPv6,功能強大且運行效率高,很多知名公司如Google、Adobe的產品都應用過libcurl。

做libcurl開發,需要將靜態庫文件加到編譯鏈接環境中,並且要dll動態運行庫支持。

1. 關於curl_global_init()和curl_global_cleanup()

libcurl提供了一組C語言API函數直接調用。首先需要提到的兩個函數就是curl_global_init()和curl_global_cleanup()。

libcurl要用到一系列的全局常量,curl_global_init()函數就是初始化這些變量,並分配一些全局資源;curl_global_cleanup()則負責釋放這些資源。因此一般情況下,在調用libcurl函數之前,先用curl_global_init(CURL_GLOBAL_ALL)做初始化,在調用完畢後,用curl_global_cleanup()退出。

需要注意的是,這些全局變量和資源並不是線程安全的,因此,在多線程應用的環境中,最好不要多次調用curl_global_init()和curl_global_cleanup(),調用其他函數並不會改變這些全局變量和資源。

2. 調用方式

libcurl支持3種不同的接口調用方式,分別是"easy"、"multi"和"share"模式。

libcurl-easy是一組同步接口,函數都是curl_easy_*形式,這種模式調用curl_easy_perform()函數進行URL數據傳輸,直到傳輸完成函數才返回;

libcurl-multi是一組異步接口,函數都是curl_multi_*形式,調用curl_multi_perform()函數進行傳輸,但是每次調用只傳一片數據,我們可以用select()函數控制多個下載任務進行同步下載,來實現在一個線程中同時下載多個文件;

libcurl-share允許在多線程中操作共享數據。下面以libcurl-easy爲例講一下libcurl的函數。

1. CURL *curl_easy_init()

此函數需要最先被調用,返回CRUL easy句柄;後續其他函數調用都要用到這個句柄。如果沒有調用curl_global_init(),該函數自動調用,但是考慮到線程安全的問題,最好自己調用curl_global_init()。

2. CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter)

所有參數和選項設置都是通過這個函數完成的,它告訴libcurl怎樣去進行傳輸。參數handle即爲curl_easy_init()返回的句柄,後面根據option的類型,設置相應的parameter值,該函數每次調用只能設置一個選項。

這裏只總結一下與下載有關的常用選項設置。

CURLOPT_URL

字符串類型,該選項設置要處理的URL地址,該選項是進行curl_easy_perform之前唯一必須要設置的選項。

CURLOPT_COOKIE

字符串類型,設置http頭中的cookie信息。

CURLOPT_COOKIEFILE

字符串類型,同CURLOPT_COOKIE,不過cookie信息從文件中讀取。

CURLOPT_FOLLOWLOCATION  

布爾值類型,該參數設置爲非零值表示follow服務器返回的重定向信息。

CURLOPT_POSTFIELDS

字符串類型,提交http的post操作字符串數據。

CURLOPT_TIMEOUT

long數值類型,設置函數執行的最長時間,時間單位爲s。

CURLOPT_CONNECTTIMEOUT

long數值類型,設置連接服務器最長時間,時間單位爲s;當置爲0時表示無限長。

CURLOPT_MAX_RECV_SPEED_LARGE

curl_off_t類型數據,指定下載過程中最大速度,單位bytes/s。

CURLOPT_HEADERFUNCTION

函數指針類型,該選項設置一個處理接收到的header數據的回調函數,函數原型爲:

size_t function( void *ptr, size_t size, size_t nmemb, void *stream);

其中,ptr指向接收到的header頭數據,數據大小爲size*nmemb,stream指向調用CURLOPT_WRITEHEADER選項設置的參數。該回調函數應返回實際處理的數據量大小,或者出錯返回-1。

CURLOPT_WRITEFUNCTION

函數指針類型,該選項設置一個處理接收到的下載數據的回調函數,函數原型爲:

size_t function( void *ptr, size_t size, size_t nmemb, void *stream);

其中,ptr指向接收到的數據,數據大小爲size*nmemb,stream指向調用CURLOPT_WRITEDATA選項設置的參數。

如果函數指針置爲NULL,則會調用默認的函數,將數據寫入到由CURLOPT_WRITEDATA指定的FILE*中。

CURLOPT_HTTPHEADER

curl_slist結構體類型,該選項自定義請求頭信息。

CURLOPT_NOPROGRESS

布爾值類型,設置該值爲非零值關閉PHP爲CRUL傳輸顯示的進度條。

3. void curl_easy_reset(CURL *handle )

重新初始化CURL句柄的選項設置。

4. CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, … )

查詢CRUL會話的內部信息,具體說明請參考curl自帶文檔。

5. void curl_easy_cleanup(CURL * handle )

該函數與curl_easy_init函數成對出現,handle即爲調用curl_easy_init返回的句柄。該函數在CURL會話結束退出時調用,之後handle無效。

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