libcurl庫的安裝和使用

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

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

  • 調用curl_global_init()初始化libcurl,(就像初始化套接字)
  • 調用curl_easy_init()函數得到 easy interface型指針(這個指針用來各種配置)
  • 調用curl_easy_setopt()設置傳輸選項(通過調用curl_easy_setopt這個函數來對指針進行各種配置,比如:請求的方式)
  • 根據curl_easy_setopt()設置的傳輸選項,實現回調函數以完成用戶特定任務
  • 調用curl_easy_perform()函數進行訪問請求
  • 調用curl_easy_cleanup()釋放內存

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

  • 首先進入libcurl庫得下載界面,點擊下載libcurl庫
    在這里插入圖片描述

  • 下載完成后通過共享文件夾或者FileZill或者直接拖拽將壓縮包移動到虛擬機。我這里將壓縮包拖拽至虛擬機的桌面,然后使用指令:mv ~/Desktop/curl-7.71.1.tar.bz2 .(~表示工作路徑就是/home/fhn這個路徑)將壓縮包移動到我新建的httpHandler這個文件夾里面,然后使用指令:tar vxf curl-7.71.1.tar.bz2解壓這個文件夾,解壓后進入文件夾,如下圖所示(之后用到的開源的庫基本都是這樣的,內容形式差不多):
    在這里插入圖片描述

  • 那么如何使用這種開源的壓縮包呢?這個文件夾下面有一個README文件夾,里面有對庫的一些說明,如下圖所示,由下圖可知,我們使用libcurl庫時可以查看curl.1手冊或者MANUAL document這個手冊
    在這里插入圖片描述

  • 這里我用有道翻譯將這些英文進行了簡單地翻譯:
    自述:Curl是一個命令行工具,用于傳輸由URL(網址)指定的數據語法。通過閱讀curl了解如何使用curl。手冊頁或手冊文檔。通過閱讀install了解如何安裝Curl文檔。Libcurl是curl用來完成其工作的庫。它很容易可被您的軟件使用。閱讀libcurl。3手冊頁學習如何!你可以在FAQ文檔中找到最常見問題的答案。研究copy文件中的分發條款和類似條款。如果你分配Curl二進制文件或其他涉及libcurl的二進制文件,您可能會喜歡LICENSE-MIXING文檔。所有這些文檔以及更多文檔都可以在docs/目錄中找到。聯系:如果您有問題、疑問、想法或建議,請與我們聯系通過郵寄到一個合適的郵寄名單。參見http//curl.haxx.se/mail/該項目的所有貢獻者都列在THANKS文檔中。網站:訪問curl網站獲取最新消息和下載:https://curl.haxx.se/,GIT:要從GIT服務器上下載最新的源代碼,請這樣做:git克隆https://github.com/curl/curl.git,(您將創建一個名為curl的目錄,并填充源代碼)。安全問題:通過我們的HackerOne頁面報告可疑的安全問題,而不是在公共場合!https://hackerone.com/curl請注意:Curl包含的源代碼是版權所有? 1998, 1999。終于Tekniska Hogskolan。在此附上此通知是為了遵守分布條件。

  • 通過閱讀README我們并沒有找到如何使用這個庫,然后進入到docs這個文件夾,這個文件夾是對RADME的一個補充,在這個文件夾下面我們會看到README里面提到的curl1.1這個API相關的手冊,還有INSTALL(這個一定要看,有時候他會和README都放在解壓后的文件夾里面,有時候會放在docs里面)。
    在這里插入圖片描述

  • 打開INSTALL后看到,提示說如何編譯(compile)這個庫請看INSTALL.md這個文件,打開這個文件后,里面有介紹如何安裝編譯后的libcurl庫,然后下面可以看到在UNIX環境下面如何進行安裝,如下圖所示,./config就是配置的一個東西,就是將庫安裝到哪里,若后面不跟任何的參數,就是默認安裝(可能安裝在/usr/lib或者/usr/include下面)。make就是編譯的意思,make install就是將編譯后的東西拷貝到根目錄的相關文件夾下面。如果默認安裝的話可能需要root權限因為:默認可能安裝在/usr/lib或者/usr/include下面,而訪問這兩個文件夾需要root權限。
    在這里插入圖片描述

  • 當然一般不安裝在默認的路徑下面,可以通過下圖方式指定安裝路徑
    在這里插入圖片描述在這里插入圖片描述

  • 通過指令:./configure --help可以查看configure都支持哪些功能參數,其中下面的HOST這個指令可以指定交叉編譯的編譯器(若不指定交叉編譯工具默認使用gcc編譯工具)。
    在這里插入圖片描述

  • 通過以下指令:./configure --prefix=$PWD/_install進行指定位置的安裝,安裝的時候會生成一個_install文件夾,庫將會被安裝到這個文件夾下面,安裝過程中沒有出現任何error表示安裝成功,然后使用指令:make進行編譯,然后使用使用指令:make install進行拷貝,然后會發現當前文件夾下面生成了一個_install文件夾,然后進入到該文件夾,如下圖所示:
    在這里插入圖片描述

調用libcurl庫訪問百度主頁并將數據保存到文件中:

程序代碼:

#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)  // 返回結果用文件存儲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);// 改協議頭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主體數據輸出到fp指向的文件res = curl_easy_perform(curl);   // 執行if (res != 0) {curl_slist_free_all(headers);curl_easy_cleanup(curl);}fclose(fp);return true;}
}
int main(void)
{getUrl("/tmp/get.html");
}
  • 使用指令:gcc demo1.c -o demo1 -I ~/httphandler/curl-7.71.1/_install/include -L ~/httphandler/curl-7.71.1/_install/lib/ -lcurl進行編譯,-I是指定頭文件的查找路徑,-L是指定庫文件的查找路徑,同時還要-l curl,編譯后的執行文件在執行的時候出現以下圖中錯誤:因為在程序執行的時候,默認去/usr/lib去找庫,然而沒有找到,所以我們要設置動態庫的環境遍變量:使用指令:export LD_LIBRARY_PATH=庫的路徑,這種方法臨時有效,永久生效的環境變量設置,編輯/etc/profile即可。也可以修改工作目錄下的.bashrc 文件。

在這里插入圖片描述

  • 通過以上設置然后再執行程序:可以看到/tmp/get.html這個文件夾里面有從百度網頁獲取的html代碼:
    在這里插入圖片描述

libcurl庫函數介紹:

  • curl_global_init(long flags)函數:
CURLcode curl_global_init(long flags)功能:初始化libcurl
這個函數只能用一次。(其實在調用curl_global_cleanup 函數后仍然可再用)
如果這個函數在curl_easy_init函數調用時還沒調用,它將由libcurl庫自動調用
所以多線程下最好主動調用該函數以防止在線程中curl_easy_init時多次調用。注意:雖然libcurl是線程安全的,但curl_global_init是不能保證線程安全的,、
所以不要在每個線程中都調用curl_global_init,應該將該函數的調用放在主線程中。參數:flags
CURL_GLOBAL_ALL                      //初始化所有的可能的調用。
CURL_GLOBAL_SSL                      //初始化支持 安全套接字層。
CURL_GLOBAL_WIN32            //初始化win32套接字庫。
CURL_GLOBAL_NOTHING         //沒有額外的初始化。
  • void curl_global_cleanup(void)函數: 結束libcurl使用的時候,用來對curl_global_init做的工作清理。類似于close的函數。注意:雖然libcurl是線程安全的,但curl_global_cleanup是不能保證線程安全的,所以不要在每個線程中都調用curl_global_init,應該將該函數的調用放在主線程中。
  • char * curl_version( )函數: 打印當前libcurl庫的版本。
  • CURL * curl_easy_init( )函數: curl_easy_init用來初始化一個CURL的指針(有些像返回FILE類型的指針一樣). 相應的在調用結束時要用url_easy_cleanup函數清理.一般curl_easy_init意味著一個會話的開始. 它會返回一個easy_handle(CURL*對象), 一般都用在easy系列的函數中.
  • void curl_easy_cleanup(CURL * handle)函數: 這個調用用來結束一個會話.與curl_easy_init配合著用. 參數:CURL類型的指針.
  • 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手冊.
  • CURLcode curl_easy_perform(CURL * handle)函數: 在初始化CURL類型的指針以及curl_easy_setopt完成后調用. 就像字面的意思所說perform就像是個舞臺.讓我們設置的option 運作起來.參數:CURL類型的指針.

curl_easy_setopt函數部分選項介紹:
本節主要介紹curl_easy_setopt中跟http相關的參數。該函數是curl中非常重要的函數,curl所有設置都是在該函數中完成的,該函數的設置選項眾多,注意本節的闡述的只是部分常見選項。

  • CURLOPT_URL 設置訪問URL。比如:curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com")

  • CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA
    回調函數原型為:size_t function( void *ptr, size_t size, size_t nmemb, void *stream); 函數將在libcurl接收到數據后被調用,因此函數多做數據保存的功能,如處理下載文件。CURLOPT_WRITEDATA 用于表明CURLOPT_WRITEFUNCTION函數中的stream指針的來源。如果你沒有通過CURLOPT_WRITEFUNCTION屬性給easy handle設置回調函數,libcurl會提供一個默認的回調函數,它只是簡單的將接收到的數據打印到標準輸出。你也可以通過 CURLOPT_WRITEDATA屬性給默認回調函數傳遞一個已經打開的文件指針,用于將數據輸出到文件里。

  • CURLOPT_HEADERFUNCTIONCURLOPT_HEADERDATA
    回調函數原型為 size_t function( void *ptr, size_t size,size_t nmemb, void *stream); libcurl一旦接收到http 頭部數據后將調用該函數。CURLOPT_WRITEDATA 傳遞指針給libcurl,該指針表明CURLOPT_HEADERFUNCTION 函數的stream指針的來源。

  • CURLOPT_READFUNCTIONCURLOPT_READDATA
    libCurl需要讀取數據傳遞給遠程主機時將調用CURLOPT_READFUNCTION指定的函數,函數原型是:size_t function(void *ptr, size_t size, size_t nmemb,void *stream). CURLOPT_READDATA 表明CURLOPT_READFUNCTION函數原型中的stream指針來源。

  • CURLOPT_NOPROGRESSCURLOPT_PROGRESSFUNCTIONCURLOPT_PROGRESSDATA
    跟數據傳輸進度相關的參數。CURLOPT_PROGRESSFUNCTION 指定的函數正常情況下每秒被libcurl調用一次,為了使CURLOPT_PROGRESSFUNCTION被調用,CURLOPT_NOPROGRESS必須被設置為false,CURLOPT_PROGRESSDATA指定的參數將作為CURLOPT_PROGRESSFUNCTION指定函數的第一個參數, -

  • CURLOPT_TIMEOUTCURLOPT_CONNECTIONTIMEOUT:
    CURLOPT_TIMEOUT 由于設置傳輸時間,CURLOPT_CONNECTIONTIMEOUT 設置連接等待時間

  • CURLOPT_FOLLOWLOCATION,設置重定位URL

curl_easy_perform 函數說明(error 狀態碼):
該函數是完成curl_easy_setopt指定的所有選項,本節重點介紹curl_easy_perform的返回值。返回0意味一切ok,非0代表錯誤發生。主要錯誤碼說明:

  • CURLE_OK 任務完成一切都好
  • CURLE_UNSUPPORTED_PROTOCOL 不支持的協議,由URL的頭部指定
  • CURLE_COULDNT_CONNECT 不能連接到remote 主機或者代理
  • CURLE_REMOTE_ACCESS_DENIED 訪問被拒絕
  • CURLE_HTTP_RETURNED_ERROR Http返回錯誤
  • CURLE_READ_ERROR 讀本地文件錯誤
    要獲取詳細的錯誤描述字符串,可以通過const char *curl_easy_strerror(CURLcode errornum ) 這個函數取得.

參考博文:http協議之libcurl

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 微信縮小通話界面_安卓如何做出微信那樣的界面仿微信“我”的界面2/5...

本系列目標通過安卓編程仿寫微信“我”的界面,讓大家也能做出類似微信界面.效果圖如下:本文目標做出支付部分(其他部分在后續文章中逐步分享).效果圖如下:實現方案通過截圖工具或者下載一張微信支付照片,放到工程的src/main/res/drawable目錄下,命名為pay.png;同樣獲取一張向右…

Shell腳本中函數的定義和調用筆記

Shell腳本函數的作用主要是把一些可以通用的功能封裝起來、避免腳本中出現大量重復的腳本代碼&#xff0c;同時可以大大增強腳本的可讀性、和可維護性。Shell函數定義的語法格式&#xff1a;function FUNCTION_NAME(){command1command2command3}也可以省略function 關鍵字FUNCT…

opensll、libcurl庫安裝的使用,樹莓派CSI攝像頭的配置,樹莓派調用智能API平臺實現人臉識別、樹莓派配置中文環境

接著上一節人工智能翔云平臺介紹&#xff1a; 人工智能OCR識別&#xff1a; OCR 是英文Optical Character Recognition的縮寫&#xff0c;意思是光學字符識別&#xff0c;也可簡單地稱為文字識別&#xff0c;是文字自動輸入的一種方法。它通過 掃描 和攝像等光學輸入方式獲取紙…

apache 設置禁止訪問某些文件或目錄

【apache配置禁止訪問】1. 禁止訪問某些文件/目錄增加Files選項來控制&#xff0c;比如要不允許訪問 .inc 擴展名的文件&#xff0c;保護php類庫&#xff1a;<Files ~ "\.inc$">Order allow,denyDeny from all</Files>禁止訪問某些指定的目錄&#xff1a…

Shell腳本中函數返回值的用法筆記

函數的返回值又可以稱為函數的退出狀態&#xff0c;實際上可以理解為一種通信方式。Shell腳本中函數可以使用返回值的方式把調用的結果信息反饋給調用者。便于調用者可以根據反饋的結果做相應處理。說明&#xff1a;函數的返回值主要使用 return 關鍵字來處理。這和很多編程語言…

python 怎么取對數_概率矩陣分解(PMF)及MovieLens上的Python代碼

首先對Probabilistic Matrix Factorization這篇論文的核心公式進行講解和推導&#xff1b;然后用Python代碼在Movielens數據集上進行測試實驗。一、 背景知識文中作者提到&#xff0c;傳統的協同過濾算法有兩個不足&#xff1a;1).不能很好地處理規模非常大的數據&#xff1b;2…

JAVA SE、EE、ME,JRE、JDK,基本數據類型,訪問修飾符、函數、封裝的概念、UML類圖、構造方法、this關鍵字、static關鍵字、方法重載、方法重寫、包(packahe)

運行第一個JAVA程序&#xff1a; 這里使用的開發環境是eclipse&#xff0c;新建一個java工程&#xff0c;然后可以看到src這個是存放java代碼的地方&#xff0c;然后在src文件右擊新建一個class&#xff08;類&#xff09;&#xff0c;然后可以看到下圖&#xff0c;同樣和C語言…

unity中如何解決鏡頭穿透模型?

設置相機的Near clip plane,調小一點,但是不要給負數就行。 轉載于:https://www.cnblogs.com/ZeroMurder/p/5331174.html

Shell腳本中函數位置參數的用法筆記

位置參數主要是用于調用函數的時候有時候需要傳遞參數&#xff0c;有很大的比例都是需要調用函數的時候動態傳遞參數&#xff0c;從而實現相應的功能。比如我想要計算兩個數的和&#xff0c;可以通過函數是實現&#xff0c;需要定義兩個參數作為計算的值。這樣的計算兩個數的函…

生鮮配送小程序源碼_生鮮社區團購配送系統小程序源碼搭建平臺模式

生鮮配送系統開發&#xff0c;找【金生157威6875店2419同號】生鮮配送模式開發&#xff0c;生鮮配送軟件開發&#xff0c;生鮮配送APP開發&#xff0c;生鮮配送平臺開發平臺&#xff0c;生鮮配送系統源碼開發平臺&#xff0c;生鮮配送系統平臺&#xff0c;生鮮配送系統定制開發…

軟件開發的早期為何要進行可行性研究?該從哪幾個方面研究目標系統的可行性?...

因為并非任何問題都有簡單明顯的解決辦法&#xff0c;很多問題不可能在預定的系統規模或者時間期限內解決。如果問題沒有可行的解決方案&#xff0c;那么花費在這工程上的任何時間人力經費等資源都是浪費。。 一般來說&#xff0c;至少應該從如下3個方面研究其可行性&#xff1…

繼承的概念和實現 、 super關鍵字 、 Object常見方法、抽象類、接口、模板方法模式、成員內部類、匿名內部類

這篇博客將會涉及到&#xff1a; 繼承的概念和實現super關鍵字方法重寫—OverrideObject常見方法 繼承的概念&#xff1a; 生活中&#xff0c;繼承的概念隨處可見&#xff0c;繼承需要符合的關系&#xff1a;is-a&#xff1b;父類更通用、子類更特殊更具體。就比如說&#x…

盤點關于程序員的10個有趣的段子

&#xff08;1&#xff09;程序員的讀書歷程&#xff1a;x 語言入門 —> x 語言應用實踐 —> x 語言高階編程 —> x 語言的科學與藝術 —> 編程之美 —> 編程之道 —> 編程之禪—> 頸椎病康復指南。&#xff08;2&#xff09;程序員最討厭的四件事&#x…

oracle 修索引改空間_Oracle如何更改表空間的數據文件位置詳解

表空間概述Oracle的表空間屬于Oracle中的存儲結構&#xff0c;是一種用于存儲數據庫對象(如&#xff1a;數據文件)的邏輯空間&#xff0c;是Oracle中信息存儲的最大邏輯單元&#xff0c;其下還包含有段、區、數據塊等邏輯數據類型。表空間是在數據庫中開辟的一個空間&#xff0…

開發 調試

在開發中&#xff0c;若代碼已寫完&#xff0c;服務器上運行卻出錯&#xff0c;或者沒有結果。此時&#xff0c;應想辦法盡可能獲取更多的信息&#xff0c;有如下方法&#xff1a;&#xff3b;今后要根據學習、工作持續增加內容&#xff3d; 1、打開瀏覽器的調試&#xff0c;谷…

Linux 用戶管理命令筆記

目錄 1、新增用戶 2、刪除用戶 3、修改用戶 4、修改用戶密碼 1、新增用戶 useradd user1 用戶創建流程 1、系統先將用戶信息記錄在/etc/passwd中&#xff0c;一般會在/etc/passwd和/etc/shadow末尾,同時分配該用戶UID。 2、創建用戶目錄&#xff0c;一般創建路徑/home目錄中。…