最近開發的遊戲之中須要用到大量的客戶端與服務端交互的 東西,開始參考大量的技術文章,感受是五花八門,眼花繚亂。到後面,真正感覺到,學習一門技術,仍是須要從它最開始的東西開始學起,要不就是一頭霧水,這種感受實在是太難受了。並且建議要學習技術的人,直接去官網學習,反而是最高效的途徑。xcode
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,能夠很是方便地用來作相關開發。cookie
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的函數。
一、CURL *curl_easy_init()
此函數須要最早被調用,返回CRUL easy句柄;後續其餘函數調用都要用到這個句柄。若是沒有調用curl_global_init(),該函數自動調用,可是考慮到線程安全的問題,最好本身調用curl_global_init()。多線程
二、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。curl
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傳輸顯示的進度條。
三、void curl_easy_reset(CURL *handle )
從新初始化CURL句柄的選項設置。
四、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... )
查詢CRUL會話的內部信息,具體說明請參考curl自帶文檔。
五、void curl_easy_cleanup(CURL * handle )
該函數與curl_easy_init函數成對出現,handle即爲調用curl_easy_init返回的句柄。該函數在CURL會話結束退出時調用,以後handle無效。異步