對curl的一些研究
前兩天看到有人求客戶端socket 發http包的**,受flw版主啟發找了一些perl的資料,不過對perl 還是不太熟悉。也沒有深入的研究。無意中發現了libcurl.so 這個庫。去google上搜尋發現它是處理客戶端傳送http請求的庫 以及可以處理web伺服器回送回來的包。研究了兩天將研究的成果,共享出來給大家一起研究。
參考:http://curl.haxx.se/ 這是curl開發者的首頁。
利用libcurl.so庫 我們能輕鬆的連線某個web站點。獲得某個首頁的html** 或者是http 請求的頭部。 還可以提交表單,
此外它還支援ftp,https,
/usr/include/curl/curl.h 中。
1 curlcode curl_global_init(long flags);
描述:這個函式只能用一次。(其實在呼叫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( );
描述: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型的變數.它用什麼這取決於第二個引數.
curloption 這個引數的取值很多.具體的可以檢視man手冊.
7 curlcode curl_easy_perform(curl *handle);
描述:這個函式在初始化curl型別的指標 以及curl_easy_setopt完成後呼叫. 就像字面的意思所說perform就像是個舞台.讓我們設定的
option 運作起來.
引數:curl型別的指標.
對curl的一些研究
下面來看乙個簡單的例子:
用來獲得某個主頁的html**
[code]#include ;
#include ;
#include ;
int main(int argc, char *argv)
curl = curl_easy_init(); //初始化乙個curl型別的指標
if(curl!=null)
return 0; }
編譯: gcc -o 001 -wall 001.c -lcurl
我們來獲得www.www.lslnet.com/linux 主頁的html**
對curl的一些研究
再來看乙個例子:
實際程式設計時 我們未必只顯示出來.我們的目的是要對獲得html**做相應的處理.比如檢驗關鍵字,發現重要資訊等等.
那麼我們就需要把獲得的html**存入相應的檔案中.看下面乙個例子
[code]
#include ;
#include ;
#include ;
#include ;
#include ;
#include ;
file *fp; //定義file型別指標
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) //這個函式是為了符合curlopt_writefunction, 而構造的
int main(int argc, char *argv)
curl_easy_setopt(curl, curlopt_writefunction, write_data); //curlopt_writefunction 將後繼的動作交給write_data函式處理
這個例子就將html**儲存在了www.www.lslnet.com/linux檔案中了.
對curl的一些研究
此外還可以獲得http報文的頭部 post表單 等等. 這裡就不詳細的介紹了. 具體的可以man curl_easy_setopt
(要用到乙個重要的結構體,httppost)
[code]#include ;
#include ;
#include ;
#include ;
struct ftpfile //定義乙個結構為了傳遞給my_fwrite函式.可用curl_easy_setopt的curlopt_writedata選項傳遞 ;
int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
return fwrite(buffer, size, nmemb, out->;stream); }
int main(int argc, char *argv)
; //初始化乙個ftpfile結構
curl_global_init(curl_global_default);
curl = curl_easy_init();
if(curl)
if(ftpfile.stream)
fclose(ftpfile.stream);
curl_global_cleanup();
return 0; }
gcc -o 003 -wall 003.c -lcurl
./003 ftp://202.96.64.144/fei.gif fei.gif
我有個匿名的ftp的** 將目錄下的fei.gif 儲存到本地 也叫fei.gif
curl 庫 還有好多功能. 有待大家來挖掘.
對CURL的一些研究
前兩天看到有人求客戶端socket 發http包的 受flw版主啟發找了一些perl的資料,不過對perl 還是不太熟悉。也沒有深入的研究。無意中發現了libcurl.so 這個庫。去google上搜尋發現它是處理客戶端傳送http請求的庫以及可以處理web伺服器回送回來的包。研究 了兩天將研究的成...
對CURL的一些研究
對curl的一些研究 前兩天看到有人求客戶端socket 發http包的 受flw版主啟發找了一些perl的資料,不過對perl 還是不太熟悉。也沒有深入的研究。無意中發現了libcurl.so 這個庫。去google上搜尋發現它是處理客戶端傳送http請求的庫 以及可以處理web伺服器回送回來的包...
今日對nginx php http的一些研究
第一次寫部落格啊 一直想開始寫自己的技術部落格,並作為一種習慣延續下去,但是一直以各種沒有時間的理由而沒有做,不管怎麼樣今天記錄下自己 一.nginx php http server 的搭建工作,說說我想在這個應用上,除了自己工作需要外,自己想利用它做些什麼把 1.網路的html文件資料,給http...