一:LibCurl 編程流程
1.調用curl_global_init()初始化libcurl
2.調用 curl_easy_init()函數得到 easy interface型指針
3.調用curl_easy_setopt設置傳輸選項
4.根據curl_easy_setopt設置的傳輸選項,實現回調函數以完成用戶特定任務
5.調用curl_easy_perform()函數完成傳輸任務
6.調用curl_easy_cleanup()釋放內存
二:重要函數
1、CURLcode curl_global_init(long flags); //初始化libcurl
描述:這個函數只能用一次。(其實在調用curl_global_cleanup 函數后仍然可再用),如果這個函數在curl_easy_init函數調用時還沒調用,它全由libcurl庫自動完成。
參數:flags
CURL_GLOBAL_ALL //初始化所有的可能的調用。
CURL_GLOBAL_SSL //初始化支持 安全套接字層。
CURL_GLOBAL_WIN32 //初始化win32套接字庫。
CURL_GLOBAL_NOTHING //沒有額外的初始化。
2、void curl_global_cleanup(void);
描述:在結束libcurl使用的時候,用來對curl_global_init做的工作清理。類似於close的函數。
3、char *curl_version( );
描述: 打印當前libcurl庫的版本。
4、CURL *curl_easy_init( ); //得到 easy interface型指針
描述:curl_easy_init用來初始化一個CURL的指針(有些像返回FILE類型的指針一樣). 相應的在調用結束時要用curl_easy_cleanup函數清理.
一般curl_easy_init意味着一個會話的開始. 它的返回值一般都用在easy系列的函數中.
5、void curl_easy_cleanup(CURL *handle); //釋放內存
描述:這個調用用來結束一個會話.與curl_easy_init配合着用.
參數:CURL類型的指針.
6、CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); //設置的傳輸選項,實現回調函數以完成用戶特定任務
描述: 這個函數最重要了.幾乎所有的curl 程序都要頻繁的使用它.它告訴curl庫.程序將有如何的行為. 比如要查看一個網頁的html代碼等.(這個函數有些像ioctl函數)參數:
(1) CURL類型的指針
(2) 各種CURLoption類型的選項.(都在curl.h庫里有定義,man 也可以查看到)
(3) parameter 這個參數既可以是個函數的指針,也可以是某個對象的指針,也可以是個long型的變量.它用什么這取決於第二個參數.
(4) CURLoption 這個參數的取值很多.具體的可以查看man手冊.
描述:這個函數在初始化CURL類型的指針 以及curl_easy_setopt完成后調用. 就像字面的意思所說perform就像是個舞台.讓我們設置的option 運作起來.
參數:CURL類型的指針.
補充:
(1)在連接過程中,如果出現異常,如網線拔掉,返回CURLE_COULDNT_CONNECT;
(2)在下載過程中,即已經連接上了,后面如果出現異常,如網線拔掉,返回CURLE_OPERATION_TIMEOUTED
8、curl_slist_append(struct curl_slist * list, const char * string ); //add a string to an slist
9、curl_slist_free_all(slist); // free the list again
10、curl_formadd(struct curl_httppost ** firstitem, struct curl_httppost ** lastitem, ...) //add a section to a multipart/formdata HTTP POST
11、其它
/****************************************************************/
libcurl note(Http應用)
設置Callback function處理Http頭,返回內容,進度
CURLOPT_WRITEFUNCTION
CURLOPT_WRITEDATA
CURLOPT_HEADERDATA
CURLOPT_PROGRESSFUNCTION
CURLOPT_PROGRESSDATA
設置連接等待時間,傳輸等待時間:
CURLOPT_TIMEOUT:CURLOPT_CONNECTIONTIMEOUT:
設置重定位URL:
CURLOPT_FOLLOWLOCATION
實現斷點續傳:
CURLOPT_RANGE:
CURLOPT_RESUME_FROM:
CURLOPT_RESUME_FROM:
注: 在我的測試中 這兩個參數無效。
設置RANGE后 下載全部數據,而不是后續數據;
設置RESUME_FROM后,程序無響應。
Range: bytes=xx- [可以用來實現斷點續傳]
User-Agent: xx
Location: [網頁重定位 url]
Set-Cookie: [Cookie]
Content-Length: [報文長度]
Content-Type: [報文類型]
/****************************************************************/
三:應用實例
1、為什么要使用libcurl,
(1)作為http的客戶端,可以直接用socket連接服務器,然后對到的數據進行http解析,但要分析協議頭,實現代理…這樣太麻煩了。
(2)libcurl是一個開源的客戶端url傳輸庫,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,支持Windows,Unix,Linux等平台,簡單易用,且庫文件占用空間不到200K。
2、get和post方式
客戶端在http連接時向服務提交數據的方式分為get和post兩種
(1)Get方式將所要傳輸的數據附在網址后面,然后一起送達服務器,它的優點是效率比較高;缺點是安全性差、數據不超過1024個字符、必須是7位的ASCII編碼;查詢時經常用此方法。
(2)Post通過Http post處理發送數據,它的優點是安全性較強、支持數據量大、支持字符多;缺點是效率相對低;編輯修改時多使用此方法。
3、cookie與session
(1)cookie是發送到客戶瀏覽器的文本串句柄,並保存在客戶機硬盤上,可以用來在某個Web站點會話之間持久地保持數據。cookie在客戶端。
(2)session是訪問者從到達某個特定主頁到離開為止的那段時間。每一訪問者都會單獨獲得一個session,實現站點多個用戶之間在所有頁面中共享信息。session在服務器上。
(3)libcurl中使用cookie,保存cookie, 使之后的鏈接與此鏈接使用相同的cookie
(3.1)在關閉鏈接的時候把cookie寫入指定的文件: curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");
(3.2)取用現在有的cookie,而不重新得到cookie: curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt");
4、http與https的區別
(1)Http是明文發送,任何人都可以攔截並讀取內容
(2)Https是加密傳輸協議,用它傳輸的內容都是加密過的,https是http的擴展,其安全基礎是SSL協議
5、base64編碼
(1)如果要傳一段包含特殊字符比較多的數據,直接上傳就需要處理轉意符之類的很多問題,用base64編碼,它可以把數據轉成可讀的字串,base64由a-z, A-Z, +/總計64個字符組成。
(2)由於base64的組成部分有加號,而加號是url中的轉意字符,所以無論是get方式還是post,傳到服務器的過程中,都會把加號轉成空格,所以在傳base64之前需要把base64編碼后的加號替換成”%2B”,這樣就可以正常發送了。
6、curl_setop()函數中的參數中文說明
curl_setopt()函數將為一個CURL會話設置選項。option參數是你想要的設置,value是這個選項給定的值。下列選項的值將被作為長整形使用(在option參數中指定)
代碼例程