CURL使用


最近開發的游戲之中需要用到大量的客戶端與服務端交互的 東西,開始參考大量的技術文章,感覺是五花八門,眼花繚亂。到后面,真正感受到,學習一門技術,還是需要從它最開始的東西開始學起,要不就是一頭霧水,這種感覺實在是太難受了。而且建議要學習技術的人,直接去官網學習,反而是最高效的途徑。

    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無效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM