最近開發的游戲之中需要用到大量的客戶端與服務端交互的 東西,開始參考大量的技術文章,感覺是五花八門,眼花繚亂。到后面,真正感受到,學習一門技術,還是需要從它最開始的東西開始學起,要不就是一頭霧水,這種感覺實在是太難受了。而且建議要學習技術的人,直接去官網學習,反而是最高效的途徑。
curl的官網地址是:http://curl.haxx.se/
好的,現在開始介紹下curl這個強大的工具。
curl是一個基於命令行的應用工具,提供利用URL標准進行文件傳輸的功能。目前已經支持非常多的流行的互聯網協議,如:FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE等。curl支持SSL認證,HTTP POST/PUT,FTP上傳,HTTP上傳、代理、cookies、用戶+密碼認證、文件續傳、代理管道等一系列強大功能。curl是用C語言寫的,但是綁定了很多開發語言。大體上可以把curl分成命令行工具和libcurl庫兩個部分,命令行工具可以直接輸入指令完成相應功能,libcurl則是一個客戶端URL傳輸庫,是線程安全且兼容IPv6,可以非常方便地用來做相關開發。
curl可以使用命令行直接操作,也可以使用libcurl庫進行上層應用的開發。我們這里主要講解libcurl庫的使用。使用環境是mac系統,xcode編譯環境和cocos2d-X游戲引擎。
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(),調用其他函數並不會改變這些全局變量和資源。
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值,該函數每次調用只能設置一個選項。具體的option講解在這篇博文中有較全面的介紹:
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無效。