自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux中級—Libcurl庫訪問百度

系統(tǒng) Linux
libcurl是一個跨平臺的網(wǎng)絡(luò)協(xié)議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協(xié)議。libcurl同樣支持HTTPS證書授權(quán),HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認(rèn)證。

libcurl簡介:

libcurl是一個跨平臺的網(wǎng)絡(luò)協(xié)議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協(xié)議。libcurl同樣支持HTTPS證書授權(quán),HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認(rèn)證。libcurl的官網(wǎng) 、庫下載。這種庫使用的時候就像使用wiringPi庫一樣,編寫完代碼需要鏈接這個庫,所以要先下載這個庫。

libcurl等第三方庫的通用編譯方法:

  • 首先進入libcurl庫得下載界面,點擊下載libcurl庫。
  • 下載完成后通過共享文件夾或者FileZill或者直接拖拽將壓縮包移動到虛擬機。我這里將壓縮包拖拽至虛擬機的共享文件夾,然后使用指令:cp /mnt/hgfs/sharefile/curl-7.71.1.tar.bz2 .將壓縮包拷貝到我新建的httpHandler這個文件夾里面,然后使用指令:tar vxf curl-7.71.1.tar.bz2解壓這個文件夾,解壓后進入文件夾,如下圖所示(之后用到的開源的庫基本都是這樣的,內(nèi)容形式差不多)。
  • 那么如何使用這種開源的壓縮包呢?這個文件夾下面有一個README文件夾,里面有對庫的一些說明,如下圖所示,由下圖可知,我們使用libcurl庫時可以查看curl.1手冊或者MANUAL document這個手冊。
  • 這里我用有道翻譯將這些英文進行了簡單地翻譯: 自述:Curl是一個命令行工具,用于傳輸由URL(網(wǎng)址)指定的數(shù)據(jù)語法。通過閱讀curl了解如何使用curl。手冊頁或手冊文檔。通過閱讀install了解如何安裝Curl文檔。Libcurl是curl用來完成其工作的庫。它很容易可被您的軟件使用。閱讀libcurl。3手冊頁學(xué)習(xí)如何!你可以在FAQ文檔中找到最常見問題的答案。研究copy文件中的分發(fā)條款和類似條款。如果你分配Curl二進制文件或其他涉及l(fā)ibcurl的二進制文件,您可能會喜歡LICENSE-MIXING文檔。所有這些文檔以及更多文檔都可以在docs/目錄中找到。聯(lián)系:如果您有問題、疑問、想法或建議,請與我們聯(lián)系通過郵寄到一個合適的郵寄名單。參見http//curl.haxx.se/mail/該項目的所有貢獻者都列在THANKS文檔中。網(wǎng)站:訪問curl網(wǎng)站獲取最新消息和下載:https://curl.haxx.se/,GIT:要從GIT服務(wù)器上下載最新的源代碼,請這樣做:git克隆https://github.com/curl/curl.git,(您將創(chuàng)建一個名為curl的目錄,并填充源代碼)。安全問題:通過我們的HackerOne頁面報告可疑的安全問題,而不是在公共場合!https://hackerone.com/curl請注意:Curl包含的源代碼是版權(quán)所有?1998, 1999。終于Tekniska Hogskolan。在此附上此通知是為了遵守分布條件。
  • 通過閱讀README我們并沒有找到如何使用這個庫,然后進入到docs這個文件夾,這個文件夾是對RADME的一個補充,在這個文件夾下面我們會看到README里面提到的curl1.1這個API相關(guān)的手冊,還有INSTALL(**==這個一定要看,有時候他會和README都放在解壓后的文件夾里面,有時候會放在docs里面==**)。
  • 打開INSTALL后看到 提示說如何編譯(compile)這個庫請看INSTALL.md這個文件,打開這個文件后,里面有介紹如何安裝編譯后的libcurl庫,然后下面可以看到在UNIX環(huán)境下面如何進行安裝 如下圖所示,**./config就是配置的一個東西,就是將庫安裝到哪里,若后面不跟任何的參數(shù),就是默認(rèn)安裝(可能安裝在/usr/lib或者/usr/include下面)。** ==make就是編譯的意思,make install就是將編譯后的東西拷貝到根目錄的相關(guān)文件夾下面。如果默認(rèn)安裝的話可能需要root權(quán)限==因為:默認(rèn)可能安裝在/usr/lib或者/usr/include下面,而訪問這兩個文件夾需要root權(quán)限。

linux中級——libcurl庫訪問百度

  • 當(dāng)然一般不安裝在默認(rèn)的路徑下面,可以通過下圖方式指定安裝路徑。
  • 通過指令:./configure --help可以查看configure都支持哪些功能參數(shù),其中下面的HOST這個指令可以指定交叉編譯的編譯器(若不指定交叉編譯工具默認(rèn)使用gcc編譯工具)。
  • 通過以下指令:./configure --prefix=$PWD/_install進行指定位置的安裝,安裝的時候會生成一個_install文件夾,庫將會被安裝到這個文件夾下面,安裝過程中沒有出現(xiàn)任何error表示安裝成功,然后使用指令:make進行編譯,然后使用使用指令:make install進行拷貝,然后會發(fā)現(xiàn)當(dāng)前文件夾下面生成了一個_install文件夾,然后進入到該文件夾,如下圖所示:

linux中級——libcurl庫訪問百度

調(diào)用libcurl庫訪問百度

調(diào)用libcurl庫訪問百度主頁并將數(shù)據(jù)保存到文件中, 程序代碼:

#include <stdio.h>
#include <curl/curl.h>
#define true 1
#define false 0
typedef unsigned int bool;
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回結(jié)果用文件存儲
return false;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");
curl = curl_easy_init(); // 初始化
if (curl)
{
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改協(xié)議頭
curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //將返回的http頭輸出到fp指向的文件
curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //將返回的html主體數(shù)據(jù)輸出到fp指向的文件
res = curl_easy_perform(curl); // 執(zhí)行
if (res != 0) {
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
return false;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post內(nèi)容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
int main(void)
{
getUrl("/tmp/get.html");
postUrl("/tmp/post.html");
}

大概解讀代碼: 要用一個是getUrl,一個是postUrl,用getpost兩種方法來請求的一個網(wǎng)頁。 getUrl,我們來看一下,是自己封裝的這個函數(shù),fopen這個函數(shù)去打開了一個文件,放在fp這個流里面。然后curl_easy_init去做初始化,去初始化我們的curl引擎,初始化成功以后curl_easy_setopt去設(shè)置curl相關(guān)的項, 包括我們要訪問的IP地址等等,還有一個CURLOPT_WRITEDATA。訪問成功數(shù)據(jù)返回以后呢會把數(shù)據(jù)流導(dǎo)入到這個filename這個文件里面,那filename文件是哪里呢?在/tmp/get.html。這文件如果沒有的話,他這邊fp = fopen(filename, "w")應(yīng)該會創(chuàng)建啊,去回顧一下文件相關(guān)的操作。然后將返回的 html主體數(shù)據(jù)輸出到fp指向的文件 ,**百度的訪問的所有結(jié)果往文件里面去寫**,然后curl_easy_perform執(zhí)行就是在訪問百度,如果res != 0,這個res不等于零是啥意思呢?我們?nèi)セ仡櫼幌轮疤岬降倪@個進行http請求以后的一個返回值,如果請求成功以后啊,我們?nèi)メ尫胚@相關(guān)的curl的這個句柄。并且關(guān)閉這個文件,return true;訪問成功,這個是相關(guān)的步驟。

  • 使用指令: gcc demo1.c -I ./curl-7.71.1/_install/include/ -L./curl-7.71.1/_install/lib/ -lcurl進行編譯,**-I是指定頭文件的查找路徑,-L是指定庫文件的查找路徑,同時還要-l curl,編譯后的執(zhí)行文件在執(zhí)行的時候出現(xiàn)以下圖中錯誤: 因為在程序執(zhí)行的時候,默認(rèn)去/usr/lib去找?guī)?*,然而沒有找到,所以我們要設(shè)置動態(tài)庫的環(huán)境遍變量:使用指令:export LD_LIBRARY_PATH=庫的路徑,這種方法臨時有效,永久生效的環(huán)境變量設(shè)置,編輯/etc/profile即可。也可以修改工作目錄下的.bashrc文件。 linux動態(tài)庫,靜態(tài)庫。

通過以上設(shè)置然后再執(zhí)行程序:可以看到/tmp/get.html這個文件夾里面有從百度網(wǎng)頁獲取的html代碼:

linux中級——libcurl庫訪問百度

libcurl庫函數(shù)介紹:

curl_global_init(long flags)函數(shù):

libcurl的使用(其實和socket編程時一樣,都需要一定的步驟):

調(diào)用curl_global_init()初始化libcurl,(就像初始化套接字)。

調(diào)用curl_easy_init()函數(shù)得到 easy interface型指針(這個指針用來各種配置)。

調(diào)用curl_easy_setopt()設(shè)置傳輸選項(通過調(diào)curl_easy_setopt這個函數(shù)來對指針進行各種配置,比如:請求的方式)。

根據(jù)curl_easy_setopt()設(shè)置的傳輸選項,實現(xiàn)回調(diào)函數(shù)以完成用戶特定任務(wù)。

調(diào)用curl_easy_perform()函數(shù)進行訪問請求。

調(diào)用curl_easy_cleanup()釋放內(nèi)存。

函數(shù)簡介

CURLcode curl_global_init(long flags) 功能:初始化libcurl 這個函數(shù)只能用一次。(其實在調(diào)用curl_global_cleanup 函數(shù)后仍然可再用) 如果這個函數(shù)在curl_easy_init函數(shù)調(diào)用時還沒調(diào)用,它將由libcurl庫自動調(diào)用 所以多線程下最好主動調(diào)用該函數(shù)以防止在線程中curl_easy_init時多次調(diào)用。

注意:雖然libcurl是線程安全的,但curl_global_init是不能保證線程安全的, 所以不要在每個線程中都調(diào)用curl_global_init,應(yīng)該將該函數(shù)的調(diào)用放在主線程中。

參數(shù):flags
CURL_GLOBAL_ALL //初始化所有的可能的調(diào)用。
CURL_GLOBAL_SSL //初始化支持 安全套接字層。
CURL_GLOBAL_WIN32 //初始化win32套接字庫。
CURL_GLOBAL_NOTHING //沒有額外的初始化。
  • void curl_global_cleanup(void)函數(shù): 結(jié)束libcurl使用的時候,用來對curl_global_init做的工作清理。類似于close的函數(shù)。注意:雖然libcurl是線程安全的,但curl_global_cleanup是不能保證線程安全的,所以不要在每個線程中都調(diào)用curl_global_init,應(yīng)該將該函數(shù)的調(diào)用放在主線程中。
  • char * curl_version( )函數(shù):打印當(dāng)前l(fā)ibcurl庫的版本。
  • CURL * curl_easy_init( )函數(shù): curl_easy_init用來初始化一個CURL的指針(有些像返回FILE類型的指針一樣).相應(yīng)的在調(diào)用結(jié)束時要用url_easy_cleanup函數(shù)清理.一般curl_easy_init意味著一個會話的開始.它會返回一個easy_handle(CURL*對象), 一般都用在easy系列的函數(shù)中.
  • void curl_easy_cleanup(CURL * handle) 函數(shù): 這個調(diào)用用來結(jié)束一個會話.與curl_easy_init配合著用. 參數(shù): CURL類型的指針。

CURLcode curl_easy_setopt(CURL * handle, CURLoption option,parameter)函數(shù):

這個函數(shù)最重要了.幾乎所有的curl 程序都要頻繁的使用它.它告訴curl庫.程序?qū)⒂腥绾蔚男袨? 比如要查看一個網(wǎng)頁的html代碼等.(這個函數(shù)有些像ioctl函數(shù))。

參數(shù):

CURL類型的指針。

各種CURLoption類型的選項.(都在curl.h庫里有定義,man 也可以查看到)。

parameter 這個參數(shù) 既可以是個函數(shù)的指針,也可以是某個對象的指針,也可以是個long型的變量.它用什么這取決于第二個參數(shù). CURLoption 這個參數(shù)的取值很多.具體的可以查看man手冊。

  • CURLcode curl_easy_perform(CURL *handle)函數(shù);在初始化CURL類型的指針 以及curl_easy_setopt完成后調(diào)用. 就像字面的意思所說perform就像是個舞臺.讓我們設(shè)置的 option 運作起來.參數(shù): CURL類型的指針。
責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2014-07-25 17:12:39

數(shù)據(jù)庫WOT2014MongoDB

2013-08-22 17:08:50

2012-05-28 22:51:53

百度

2018-09-06 18:37:45

百度云

2022-04-11 18:35:03

PodVTEP云原生

2014-09-04 02:25:24

百度世界大會2014直達號BaiduEye

2011-10-21 09:28:25

百度地圖API

2012-10-19 09:47:30

百度云百度音樂云計算

2013-06-27 10:23:30

百度云百度開放云

2016-03-25 11:18:23

中華網(wǎng)

2020-12-03 06:13:46

iOS

2011-06-03 16:04:05

SEO分詞

2011-06-01 17:40:29

百度收錄

2015-10-28 13:40:28

高仿百度糯米源碼

2022-03-02 11:04:45

百度業(yè)務(wù)盈利

2011-12-08 15:31:24

百度開放平臺

2020-09-16 13:57:27

百度世界2020百度大腦

2021-08-18 16:40:54

百度人工智能

2010-06-29 11:02:05

百度谷歌
點贊
收藏

51CTO技術(shù)棧公眾號