curl c/c++ api接口使用例程

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章