欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

使用 cURL 和 libcurl 通過 Internet 進(jìn)行對話

系統(tǒng) 1647 0

cURL 是一個命令行工具,可以對文件傳輸使用許多協(xié)議,包括 HTTP、FTP、Secure Copy (SCP)、Telnet 等等。但是,除了可以用命令行通過 Internet 與端點(diǎn)對話外,還可以使用 libcurl 編寫簡單或復(fù)雜的程序,以自動化執(zhí)行應(yīng)用層的協(xié)議任務(wù)。本文將介紹 cURL 命令行工具,然后向您展示如何使用 libcurl 以及 C 和 Python 構(gòu)建一個 HTTP 客戶端。

開發(fā) HTTP 和 FTP 之類依賴于應(yīng)用層協(xié)議的應(yīng)用程序并不復(fù)雜,但也不簡單。進(jìn)一步講,這不是應(yīng)用程序的重點(diǎn),因?yàn)榇蟛糠智闆r下,協(xié)議之上的內(nèi)容才是真正重要的內(nèi)容。因 此,libcurl 引起了許多人的興趣,因?yàn)樗闹攸c(diǎn)是應(yīng)用程序而不是開發(fā)的各個方面。注意,很少有應(yīng)用程序開發(fā)自己的 TCP/IP 堆棧,所以老話重提:盡可能重用以最小化開發(fā)安排并提高應(yīng)用程序的可靠性。

本文首先簡單介紹應(yīng)用層協(xié)議,然后介紹 cURL、libcurl 并解釋它們的用法。

Web 協(xié)議

如 今構(gòu)建應(yīng)用程序已與過去大不相同。現(xiàn)在的應(yīng)用程序需要能夠通過網(wǎng)絡(luò)或 Internet 進(jìn)行通訊(提供人類可用的網(wǎng)絡(luò) API 或接口),還要能支持用戶腳本化以提高靈活性。現(xiàn)代應(yīng)用程序通常使用 HTTP 公開 Web 接口,并通過 Simple Mail Transport Protocol (SMTP) 提供警告通知。這些協(xié)議允許您將 Web 瀏覽器指向設(shè)備以獲得配置或狀態(tài)信息,并從設(shè)備或常用的電子郵件客戶端接收標(biāo)準(zhǔn)電子郵件(分別通過 HTTP 和 SMTP)。

這些 Web 服務(wù)通常構(gòu)建在網(wǎng)絡(luò)堆棧的套接字層上(見圖 1)。套接字層實(shí)現(xiàn)一個最先出現(xiàn)在 Berkeley Software Distribution (BSD) 操作系統(tǒng)上的 API,并提取底層傳輸和網(wǎng)絡(luò)層協(xié)議的詳細(xì)信息。


圖 1. 網(wǎng)絡(luò)堆棧和 libcurl
圖 1. 網(wǎng)絡(luò)堆棧和 libcurl

Web 服務(wù)發(fā)生在客戶端和服務(wù)器之間的協(xié)議對話中。在 HTTP 上下文中,服務(wù)器是終端設(shè)備,客戶端是位于端點(diǎn)上的瀏覽器。對于 SMTP,服務(wù)器是郵件網(wǎng)關(guān)或端點(diǎn)用戶,客戶端是終端設(shè)備。在某些情況下,協(xié)議對話發(fā)生在兩個步驟(請求和響應(yīng))中,但另一些情況下,需要協(xié)商和通訊的通 信量更多。這種協(xié)商可能增加了大量復(fù)雜性,這可以通過 API 進(jìn)行抽象,比如 libcurl。

cURL 最初的設(shè)計(jì)初衷是使用不同的協(xié)議(比如 FTP、HTTP、SCP 等)在端點(diǎn)之間移動文件。它最初是一個命令行實(shí)用工具,但現(xiàn)在也是一個綁定了 30 多種語言的庫。因此,現(xiàn)在不僅可以通過 shell 使用 cURL,您還可以構(gòu)建合并了這個重要功能的應(yīng)用程序。libcurl 庫也是可以移植的,支持 Linux?、IBM?AIX?操作系統(tǒng)、BSD、Solaris 以及許多其他 UNIX?變體。

獲取和安裝 cURL/libcurl

獲取和安裝 libcurl 非常簡單,取決于您所運(yùn)行的 Linux 發(fā)行版。如果運(yùn)行的是 Ubuntu,您可以使用 apt-get 輕松安裝這些包。以下行演示了如何為 libcurl 安裝 libcurl 和 Python 綁定:

               $ 
              
                sudo apt-get install libcurl3
              
              

 $ 
              
                sudo apt-get install python-pycurl
              
            

?

apt-get 實(shí)用工具確保該過程滿足所有的依賴關(guān)系。

在命令行中使用 cURL

cURL 最開始是一個命令行工具,可以使用 Uniform Resource Locator (URL) 語法執(zhí)行數(shù)據(jù)傳輸。考慮到它在命令行上的流行度,后來創(chuàng)建了一個可以在應(yīng)用程序中生成這些行為的庫。如今,命令行 cURL 是 cURL 庫的包裝器。本文首先研究 cURL 作為命令行的功能,然后深入探討如何將它作為庫使用。

cURL 的兩種常見用法是使用 HTTP 和 FTP 協(xié)議進(jìn)行文件傳輸。cURL 為這些協(xié)議提供一個簡單的接口。要使用 HTTP 從網(wǎng)站獲取文件,只需告訴 cURL 您要將網(wǎng)頁寫入到其中的本地文件的文件名、網(wǎng)站的 URL 以及要獲取的文件。讓我們看一下清單 1 中的簡單命令行示例。


清單 1. 使用 cURL 從網(wǎng)站獲取文件的示例

              				
 $ 
              
                curl -o test html www.exampledomain.com
              
              

  % Total    % Received % Xferd  Average Speed    Time    Time     Time    Current 
                                 Dload  Upload    Total   Spent    Left    Speed 
 100 43320  100 43320    0     0  55831       0 --:--:-- --:--:-- --:--:--  89299 
 $ 

            

?

注意,由于我指定了域而不是文件,我將獲得根文件(index.html)。要使用 cURL 將該文件移動到 FTP 站點(diǎn),可以使用 -T 選項(xiàng)指定要上傳的文件,然后提供 FTP 站點(diǎn)的 URL 以及文件的路徑。


清單 2. 使用 cURL 將 文件上傳 到 FTP 站點(diǎn)的示例

              				
 $ 
              
                curl -T test.html ftp://user:password@ftp.exampledomain.com/ftpdir/
              
              

  % Total    % Received % Xferd  Average Speed    Time    Time     Time    Current 
                                 Dload  Upload    Total   Spent    Left    Speed 
 100 43320    0     0  100 43320      0  38946   0:00:01 0:00:01  --:--:--    124k 
 $ 

            

?

是不是很簡單?學(xué)習(xí)了一些模式之后您會發(fā)現(xiàn),cURL 使用起來非常簡單。但是您可以使用的選項(xiàng)非常多 —在 cURL 命令行中請求幫助(使用 --help )可以得到 129 行選項(xiàng)。如果您覺得這還不算太多,那么還有一大批其他控制選項(xiàng)(從詳細(xì)度到安全性),以及特定于協(xié)議的配置項(xiàng)。

從開發(fā)人員的角度看,這還不算是 cURL 最令人興奮的地方。讓我們深入了解 cURL 庫,學(xué)習(xí)如何向應(yīng)用程序添加文件傳輸協(xié)議。

作為庫的 cURL

如 果您有 10 年以上的腳本語言經(jīng)驗(yàn),您就會注意到它們的標(biāo)記有很大的變化。Python、Ruby、Perl 等這些腳本語言不僅包含套接字層(C 或 C++ 中也有),還包含了應(yīng)用層協(xié)議 API。這些腳本語言合并了高級功能,可以創(chuàng)建 HTTP 服務(wù)器或客戶端。libcurl 庫為 C 和 C++ 之類的語言添加了類似的功能,但是它可以在不同的語言之間移植。在所有它支持的語言中都能找到與 libcurl 相當(dāng)?shù)男袨椋怯捎谶@些語言的差異很大(設(shè)想一下 C 和 Scheme),提供這些行為的方式也很不相同。

libcurl 庫以 API 的形式封裝清單 1 和清單 2 中描述的行為,因此它可以被高級語言使用(如今已超過 30 種)。本文提供了 libcurl 的兩個示例。第一個示例研究使用 c 構(gòu)建的簡單 HTTP 客戶端(適合構(gòu)建 Web 爬行器),第二個示例是一個使用 Python 創(chuàng)建的簡單 HTTP 客戶端。

基于 C 的 HTTP 客戶端

C API 在 libcurl 功能上提供了兩個 API。easy 接口是一個簡單的同步 API(意味著當(dāng)您使用請求調(diào)用 libcurl 時(shí),將能夠滿足您的請求,直到完成或發(fā)生錯誤)。多接口可以進(jìn)一步控制 libcurl,您的應(yīng)用程序可以執(zhí)行多個同步傳輸,并控制 libcurl 何時(shí)何地移動數(shù)據(jù)。

該示例使用 easy 接口。該 API 還能控制數(shù)據(jù)移動過程(使用回調(diào)),但正如其名稱所示,使用起來非常簡單。清單 3 提供了 HTTP 的 C 語言示例。


清單 3. 使用 libcurl easy 接口的 C HTTP 客戶端

              				
 #include <stdio.h> 
 #include <string.h> 
 #include <curl/curl.h> 

 #define MAX_BUF 	 65536 

 char wr_buf[MAX_BUF+1]; 
 int  wr_index; 

 /* 
 * Write data callback function (called within the context of 
 * curl_easy_perform. 
 */ 
 size_t write_data( void *buffer, size_t size, size_t nmemb, void *userp ) 
 { 
  int segsize = size * nmemb; 

  /* Check to see if this data exceeds the size of our buffer. If so, 
   * set the user-defined context value and return 0 to indicate a 
   * problem to curl. 
   */ 
  if ( wr_index + segsize > MAX_BUF ) { 
    *(int *)userp = 1; 
    return 0; 
  } 

  /* Copy the data from the curl buffer into our buffer */ 
  memcpy( (void *)&wr_buf[wr_index], buffer, (size_t)segsize ); 

  /* Update the write index */ 
  wr_index += segsize; 

  /* Null terminate the buffer */ 
  wr_buf[wr_index] = 0; 

  /* Return the number of bytes received, indicating to curl that all is okay */ 
  return segsize; 
 } 


 /* 
 * Simple curl application to read the index.html file from a Web site. 
 */ 
 int main( void ) 
 { 
  CURL *curl; 
  CURLcode ret; 
  int  wr_error; 

  wr_error = 0; 
  wr_index = 0; 

  /* First step, init curl */ 
  curl = 
              
                curl_easy_init
              
              
; 
  if (!curl) { 
    printf("couldn't init curl\n"); 
    return 0; 
  } 

  /* Tell curl the URL of the file we're going to retrieve */ 
  
              
                curl_easy_setopt
              
              
( curl, CURLOPT_URL, "www.exampledomain.com" ); 

  /* Tell curl that we'll receive data to the function write_data, and 
   * also provide it with a context pointer for our error return. 
   */ 
  
              
                curl_easy_setopt
              
              
( curl, CURLOPT_WRITEDATA, (void *)&wr_error ); 
  
              
                curl_easy_setopt
              
              
( curl, CURLOPT_WRITEFUNCTION, write_data ); 

  /* Allow curl to perform the action */ 
  ret = 
              
                curl_easy_perform
              
              
( curl ); 

  printf( "ret = %d (write_error = %d)\n", ret, wr_error ); 

  /* Emit the page if curl indicates that no errors occurred */ 
  if ( ret == 0 ) printf( "%s\n", wr_buf ); 

  
              
                curl_easy_cleanup
              
              
( curl ); 

  return 0; 
 } 

            

?

最上方是必需的 include 文件,包括 cURL 根文件。接下來,我定義了兩個用于傳輸?shù)淖兞俊5谝粋€變量是 wr_buf ,表示將在其中寫入傳入數(shù)據(jù)的緩沖區(qū)。 wr_index 表示緩沖區(qū)的當(dāng)前寫入索引。

轉(zhuǎn)到 main 函數(shù),該函數(shù)使用 easy API 進(jìn)行設(shè)置。所有 cURL 調(diào)用都通過維護(hù)特定請求狀態(tài)的句柄進(jìn)行操作。這稱為 CURL 指針引用。本例還創(chuàng)建一個特殊的返回碼,稱為 CURLcode 。在使用任何 libcurl 函數(shù)之前,您需要調(diào)用 curl_easy_init 獲取 CURL 句柄。接下來,注意 curl_easy_setopt 調(diào)用的數(shù)量。它們?yōu)樘囟ǖ牟僮髋渲镁浔τ谶@些調(diào)用,您提供句柄、命令和選項(xiàng)。首先,本例使用 CURLOPT_URL 指定要獲取的 URL。然后,它使用 CURL_WRITEDATA 提供一個上下文變量(在本例中,它是內(nèi)部的 write 錯誤變量)。最后,它使用 CURLOPT_WRITEFUNCTION 指定數(shù)據(jù)可用時(shí)應(yīng)該調(diào)用的函數(shù)。在啟動 API 之后,API 將使用它讀取的數(shù)據(jù)多次調(diào)用該函數(shù)。

要開始傳輸,調(diào)用 curl_easy_perform 。它的工作是根據(jù)之前的配置執(zhí)行傳輸。調(diào)用該函數(shù)時(shí),在完成傳輸或發(fā)生錯誤之前該函數(shù)不會返回。 main 的最后一步是提交返回狀態(tài),提交頁面讀取,最后使用 curl_easy_cleanup 清除(當(dāng)使用句柄執(zhí)行完操作后)。

現(xiàn)在看看 write_data 函數(shù)。該函數(shù)是針對特定操作收到數(shù)據(jù)時(shí)調(diào)用的回調(diào)。注意,當(dāng)您從網(wǎng)站讀取數(shù)據(jù)時(shí),將寫入該數(shù)據(jù)( write_data )。將向回調(diào)提供一個緩沖區(qū)(包含可用數(shù)據(jù))、成員數(shù)量和大小(緩沖中可用數(shù)據(jù)總量)、上下文指針。第一個任務(wù)是確保緩沖區(qū)( wr_buf )的空間足以寫入數(shù)據(jù)。如果不夠,它將設(shè)置上下文指針并返回 0,表示出現(xiàn)問題。否則,它將 cURL 緩沖區(qū)的數(shù)據(jù)復(fù)制到您的緩沖區(qū),并增加索引,指向要寫入的下一個位置。本例還終止字符串,稍后可以對其使用 printf 。最后,它返回 libcurl 操作的字節(jié)數(shù)量。這將告訴 libcurl 數(shù)據(jù)被提取,它也可以丟棄該數(shù)據(jù)。這就是從網(wǎng)站將文件讀取到內(nèi)存的相對簡單的方法。

基于 Python 的 HTTP 客戶端

本節(jié)提供的示例類似于基于 C 的 HTTP 客戶端,不過它使用的是 Python。Python 是一種非常有用的面向?qū)ο蟮哪_本語言,在原型化和構(gòu)建生產(chǎn)軟件方面非常突出。示例假設(shè)您較熟悉 Python,但使用不多,因此不要期望過高。

這個簡單的 Python HTTP 客戶端使用 pycurl ,如清單 4 所示。


清單 4. 使用 libcurl 的 pycurl 接口的 Python HTTP 客戶端

      				
 import sys 
 import pycurl 

 wr_buf = ''

 def write_data( buf ): 
	 global wr_buf 
	 wr_buf += buf 

 def main: 
	 c = 
      
        pycurl.Curl
      
      
 
	 c.
      
        setopt
      
      
( pycurl.URL, 'http://www.exampledomain.com' ) 
	 c.
      
        setopt
      
      
( pycurl.WRITEFUNCTION, write_data ) 

	 c.
      
        perform
      
      
 

	 c.
      
        close
      
      
 

 main 
 sys.stdout.write(wr_buf) 

    

這比 C 語言版本簡單的多。它首先導(dǎo)入必需的模塊(用于標(biāo)準(zhǔn)系統(tǒng)的 sys pycurl 模塊)。接下來,它定義 write 緩沖區(qū)( wr_buf )。像 C 程序中一樣,我聲明一個 write_data 函數(shù)。注意,該函數(shù)只有一個參數(shù):從 HTTP 服務(wù)器中讀取的數(shù)據(jù)緩沖區(qū)。我將該緩沖區(qū)連接到全局 write 緩沖區(qū)。 main 函數(shù)首先創(chuàng)建一個 Curl 句柄,然后使用 setopt 方法為傳輸定義 URL WRITEFUNCTION 。它調(diào)用 perform 方法啟動傳輸并關(guān)閉句柄。最后,它調(diào)用 main 函數(shù),并將 write 緩沖區(qū)提交到 stdout 。注意,在這種情況下,您不需要錯誤上下文指針,因?yàn)槟褂昧?Python 字符串連接,這就是說您不會使用大小固定的字符串。

結(jié)束語

本文僅僅簡單介紹了 libcurl,介紹了它支持的多種協(xié)議和語言。希望這能夠展示它如何輕松構(gòu)建使用應(yīng)用層協(xié)議(如 HTTP)的應(yīng)用程序。libcurl 網(wǎng)站提供了很多示例和有用的文檔。下一次開發(fā) Web 瀏覽器、爬行器或其他有應(yīng)用層協(xié)議要求的應(yīng)用程序時(shí),試試 libcurl。它一定能大大減少您的開發(fā)時(shí)間,并找回編碼的樂趣。

使用 cURL 和 libcurl 通過 Internet 進(jìn)行對話


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美另类在线观看 | 午夜免费视频 | 在线播放三级 | 国产精品美女一区二区 | 五月婷婷社区 | 欧美成人欧美激情欧美风情 | 黄色一级在线视频 | 视频一区 中文字幕 | 亚洲视频免费在线观看 | k8久久久一区二区三区 | 日本综合欧美一区二区三区 | 久久精品中文 | 免费黄网站在线播放 | 欧美一区二区三区免费高 | 国产精品视频网站 | 日韩在线欧美 | 日本一区二区三区免费观看 | 99草视频| 亚洲精品成人av | 欧美成人手机在线 | 国产牛仔裤系列在线观看 | 日本香港三级和澳门三级 | 久久久国产99久久国产首页 | 四虎影视永久免费观看网址 | 欧美精品3atv一区二区三区 | 欧美亚洲专区 | 韩日在线视频 | 国产精品国产精品国产专区不卡 | 91在线激情 | 国产精品在线 | 精品一区二区三区在线观看l | 人人99| 久爱视频www在线播放 | 婷婷色九月综合激情丁香 | 婷婷香蕉 | 中文天堂网 | 精品一区二区三区视频 | 日本www视频在线观看 | 久久久久久久久女黄 | 一级激情片| 日本理论片好看理论片 |