curl c/c++ api介面使用常式

來源:互聯網
上載者:User

from:http://blog.csdn.net/mr_von/article/details/3326728

先總結一下本站與curl相關的文章:

linux下php擴充cURL的安裝 
cURL 中文使用者手冊(一) 
cURL中文使用者手冊(二) 
curl中文使用者手冊(三)

[轉帖] php cURL函數擴充文檔 
php cURL擴充使用的例子
用curl下載大檔案

 除以上這些curl也提供一套網路c/c++ api的使用介面,以下是一個原始碼常式:

來源:http://bbs.chinaunix.net/viewthread.php?tid=586014

前兩天看到有人求用戶端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類型的指標.

 下面來看一個簡單的例子: 
用來獲得某個首頁的html代碼 

#include <stdio.h>;#include <curl/curl.h>;#include <stdlib.h>;int main(int argc, char *argv[]){    CURL *curl;//定義CURL類型的指標    CURLcode res;//定義CURLcode類型的變數    if(argc!=2)    {        printf("Usage : file <url>;/n");        exit(1);    }    curl = curl_easy_init();//初始化一個CURL類型的指標    if(curl!=NULL)    {//設定curl選項. 其中CURLOPT_URL是讓使用者指定url. argv[1]中存放的命令列傳進來的網址        curl_easy_setopt(curl, CURLOPT_URL, argv[1]);//調用curl_easy_perform 執行我們的設定.並進行相關的操作. 在這裡只在螢幕上顯示出來.        res = curl_easy_perform(curl);//清除curl操作.        curl_easy_cleanup(curl);    }    return 0;}

編譯: gcc -o 001 -Wall 001.c -lcurl 

我們來獲得www.chinaunix.net 首頁的html代碼 

./001 www.chinaunix.net

再來看一個例子: 
實際編程時 我們未必只顯示出來.我們的目的是要對獲得html代碼做相應的處理.比如檢驗關鍵字,發現重要訊息等等. 

那麼我們就需要把獲得的html代碼存入相應的檔案中.看下面一個例子 

#include <stdio.h>;#include <stdlib.h>;#include <unistd.h>;#include <curl/curl.h>;#include <curl/types.h>;#include <curl/easy.h>;FILE *fp;  //定義FILE類型指標size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)  //這個函數是為了符合CURLOPT_WRITEFUNCTION, 而構造的{    int written = fwrite(ptr, size, nmemb, (FILE *)fp);    return written;}int main(int argc, char *argv[]){    CURL *curl;    curl_global_init(CURL_GLOBAL_ALL);      curl=curl_easy_init();    curl_easy_setopt(curl, CURLOPT_URL, argv[1]);      if((fp=fopen(argv[1],"w"))==NULL)    {        curl_easy_cleanup(curl);        exit(1);    }    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  //CURLOPT_WRITEFUNCTION 將後繼的動作交給write_data函數處理    curl_easy_perform(curl);    curl_easy_cleanup(curl);    exit(0);}

gcc -o 002 -Wall 002.c -lcurl 
./002 www.chinaunix.net 
這個例子就將html代碼儲存在了www.chinaunix.net檔案中了.

此外還可以獲得http報文的頭部 post表單 等等. 這裡就不詳細的介紹了. 具體的可以man curl_easy_setopt 
(要用到一個重要的結構體,HttpPost) 

下面看一個從ftp網站下載檔案的例子. 

#include <stdio.h>;#include <curl/curl.h>;#include <curl/types.h>;#include <curl/easy.h>;struct FtpFile   //定義一個結構為了傳遞給my_fwrite函數.可用curl_easy_setopt的CURLOPT_WRITEDATA選項傳遞{        char *filename;        FILE *stream;};int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream){        struct FtpFile *out=(struct FtpFile *)stream;  // stream指標其實就是 指向struct FtpFile ftpfile的        if(out && !out->;stream)        {                out->;stream=fopen(out->;filename, "wb"); //沒有這個流的話就建立一個 名字是out->;filename.                if(!out->;stream)                return -1;        }        return fwrite(buffer, size, nmemb, out->;stream);}int main(int argc, char *argv[]){        CURL *curl;        CURLcode res;        struct FtpFile ftpfile={argv[2],NULL};  //初始化一個FtpFile結構         curl_global_init(CURL_GLOBAL_DEFAULT);        curl = curl_easy_init();        if(curl)        {                curl_easy_setopt(curl, CURLOPT_URL,argv[1]);                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);                curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);  //給相關函數的第四個參數 傳遞一個結構體的指標                curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);  //CURLOPT_VERBOSE 這個選項很常用 用來在螢幕上顯示對伺服器相關操作返回的資訊                res = curl_easy_perform(curl);                curl_easy_cleanup(curl);                if(CURLE_OK != res)                        fprintf(stderr, "curl told us %d/n", res);        }        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_escape curl_unescape函數用來轉換 漢字成 %XX 這種類型.以及轉換回來.如果要下載帶有漢字的檔案.先要調用將字串轉換一下. 

curl 庫 還有好多功能. 有待大家來挖掘.

說明:在gcc編譯的時候記得加上 -lcurl

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.