libcurl库介绍

转载 2012年03月27日 16:18:38

原文:http://www.cppprog.com/2009/1209/185.html

libcurl库是一个实现了各种客户端协议的网络编程库。目前它支持12种以上的协议,包括 FTP、HTTP、Telnet以及其他安全变体。

如果您有 10 年以上的脚本语言经验,您就会注意到它们的标记有很大的变化。Python、Ruby、Perl 等这些脚本语言不仅包含套接字层(C 或 C++ 中也有),还包含了应用层协议 API。这些脚本语言合并了高级功能,可以创建 HTTP 服务器或客户端。libcurl 库为 C 和 C++ 之类的语言添加了类似的功能,但是它可以在不同的语言之间移植。在所有它支持的语言中都能找到与 libcurl 相当的行为,但是由于这些语言的差异很大(设想一下 C 和 Scheme),提供这些行为的方式也很不相同。

libcurl 库以 API 的形式封装各种客户端协议,因此它可以被高级语言使用(如今已超过 30 种)。下面的示例研究使用 C 构建的简单 HTTP 客户端(适合构建 Web 爬行器)。

基于 C 的 HTTP 客户端

C API 在 libcurl 功能上提供了两个 API。easy 接口是一个简单的同步 API(意味着当您使用请求调用 libcurl 时,将能够满足您的请求,直到完成或发生错误)。多接口可以进一步控制 libcurl,您的应用程序可以执行多个同步传输,并控制 libcurl 何时何地移动数据。

该示例使用 easy 接口。该 API 还能控制数据移动过程(使用回调),但正如其名称所示,使用起来非常简单。清单 3 提供了 HTTP 的 C 语言示例。

使用 libcurl easy 接口的 C HTTP 客户端

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <curl/curl.h> 
  4.  
  5. #define MAX_BUF      65536 
  6.  
  7. char wr_buf[MAX_BUF+1]; 
  8. int  wr_index; 
  9.  
  10. /*
  11.  * Write data callback function (called within the context of
  12.  * curl_easy_perform.
  13.  */ 
  14. size_t write_data( void *buffer, size_t size, size_t nmemb, void *userp ) 
  15.     int segsize = size * nmemb; 
  16.  
  17.     /* Check to see if this data exceeds the size of our buffer. If so,
  18.      * set the user-defined context value and return 0 to indicate a
  19.      * problem to curl.
  20.      */ 
  21.     if ( wr_index + segsize > MAX_BUF ) { 
  22.         *(int *)userp = 1; 
  23.         return 0; 
  24.     } 
  25.  
  26.     /* Copy the data from the curl buffer into our buffer */ 
  27.     memcpy( (void *)&wr_buf[wr_index], buffer, (size_t)segsize ); 
  28.  
  29.     /* Update the write index */ 
  30.     wr_index += segsize; 
  31.  
  32.     /* Null terminate the buffer */ 
  33.     wr_buf[wr_index] = 0; 
  34.  
  35.     /* Return the number of bytes received, indicating to curl that all is okay */ 
  36.     return segsize; 
  37.  
  38.  
  39. /*
  40.  * Simple curl application to read the index.html file from a Web site.
  41.  */ 
  42. int main( void ) 
  43.     CURL *curl; 
  44.     CURLcode ret; 
  45.     int  wr_error; 
  46.  
  47.     wr_error = 0; 
  48.     wr_index = 0; 
  49.  
  50.     /* First step, init curl */ 
  51.     curl = curl_easy_init(); 
  52.     if (!curl) { 
  53.         printf("couldn't init curl "); 
  54.         return 0; 
  55.     } 
  56.  
  57.     /* Tell curl the URL of the file we're going to retrieve */ 
  58.     curl_easy_setopt( curl, CURLOPT_URL, "www.exampledomain.com" ); 
  59.  
  60.     /* Tell curl that we'll receive data to the function write_data, and
  61.      * also provide it with a context pointer for our error return.
  62.      */ 
  63.     curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&wr_error ); 
  64.     curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data ); 
  65.  
  66.     /* Allow curl to perform the action */ 
  67.     ret = curl_easy_perform( curl ); 
  68.  
  69.     printf( "ret = %d (write_error = %d) ", ret, wr_error ); 
  70.  
  71.     /* Emit the page if curl indicates that no errors occurred */ 
  72.     if ( ret == 0 ) printf( "%s ", wr_buf ); 
  73.  
  74.     curl_easy_cleanup( curl ); 
  75.  
  76.     return 0; 

最上方是必需的 include文件,包括 cURL 根文件。接下来,我定义了两个用于传输的变量。第一个变量是 wr_buf,表示将在其中写入传入数据的缓冲区。wr_index表示缓冲区的当前写入索引。

转到 main函数,该函数使用 easy API 进行设置。所有 cURL 调用都通过维护特定请求状态的句柄进行操作。这称为 CURL指针引用。本例还创建一个特殊的返回码,称为 CURLcode。在使用任何 libcurl 函数之前,您需要调用 curl_easy_init获取CURL句柄。接下来,注意 curl_easy_setopt调用的数量。它们为特定的操作配置句柄。对于这些调用,您提供句柄、命令和选项。首先,本例使用 CURLOPT_URL指定要获取的 URL。然后,它使用 CURL_WRITEDATA提供一个上下文变量(在本例中,它是内部的 write 错误变量)。最后,它使用 CURLOPT_WRITEFUNCTION指定数据可用时应该调用的函数。在启动 API 之后,API 将使用它读取的数据多次调用该函数。

要开始传输,调用 curl_easy_perform。它的工作是根据之前的配置执行传输。调用该函数时,在完成传输或发生错误之前该函数不会返回。main的最后一步是提交返回状态,提交页面读取,最后使用 curl_easy_cleanup清除(当使用句柄执行完操作后)。

现在看看 write_data函数。该函数是针对特定操作收到数据时调用的回调。注意,当您从网站读取数据时,将写入该数据(write_data)。将向回调提供一个缓冲区(包含可用数据)、成员数量和大小(缓冲中可用数据总量)、上下文指针。第一个任务是确保缓冲区(wr_buf)的空间足以写入数据。如果不够,它将设置上下文指针并返回 0,表示出现问题。否则,它将 cURL 缓冲区的数据复制到您的缓冲区,并增加索引,指向要写入的下一个位置。本例还终止字符串,稍后可以对其使用printf。最后,它返回 libcurl 操作的字节数量。这将告诉 libcurl 数据被提取,它也可以丢弃该数据。这就是从网站将文件读取到内存的相对简单的方法。

libcurl 介绍

curl 使用本文主要介绍 curl 的编程步骤。 curl 是利用 URL 语法在命令行方式下工作的开源文件传输工具。 curl 编程指南里详细介绍了 curl 的用法。 可以下载 curl ...
  • u011304970
  • u011304970
  • 2017年02月08日 10:01
  • 295

c++中使用libcurl库进行http网络编程

目录索引: 一、LibCurl基本编程框架 二、一些基本的函数 三、curl_easy_setopt函数部分选项介绍 四、curl_easy_perform 函数说明(error 状态码...
  • wangqing_12345
  • wangqing_12345
  • 2016年08月15日 15:04
  • 1792

c/c++调用libcurl库发送http请求的两种基本用法

libcurl主要提供了两种发送http请求的方式,分别是Easy interface方式和multi interface方式,前者是采用阻塞的方式发送单条数据,后者采用组合的方式可以一次性发送多条数...
  • lijinqi1987
  • lijinqi1987
  • 2016年12月30日 11:13
  • 10083

VS2012调用libcurl库

1>下载liburl 地址:http://curl.haxx.se/download.html 2>编译生成liburl.lib文件 在curl-7.30.0.zip 版本里,仅支持...
  • d_o_n_g2
  • d_o_n_g2
  • 2016年12月17日 10:30
  • 696

开源项目(库)之libcurl学习(一)

最近抽了点时间,将之前开发中使用到的一些开源库进行了下总结,主要是为了回顾一下自己所使用的一些库基础知识,并且加深理解,在这些库中,首先一个库就是libcurl,这个库很强大,当时在做openstac...
  • zmyer
  • zmyer
  • 2014年02月13日 23:16
  • 1501

vc中编译libcurl库详解

以前在vc2005下用过libcurl,今天用vc2008写另一个软件需要重新编译libcurl库以前编译的时候随便参照了一下网上的方法,感觉写的都不是很全,这次时间不紧就重新研究了下 访问网页的时候...
  • varding
  • varding
  • 2010年02月26日 13:59
  • 11622

Libcurl库常用接口使用说明,限速设置

libcurl 接口调用方式  libcurl提供了一组C语言API函数直接调用。首先需要提到的两个函数就是curl_global_init()和 curl_global_cleanup()。lib...
  • zengraoli
  • zengraoli
  • 2013年09月11日 21:22
  • 16013

libCURL开源库在VS2010环境下编译、配置详解

原文地址: http://my.oschina.net/u/1420791/blog/198247
  • atceedsun
  • atceedsun
  • 2014年10月29日 09:35
  • 3144

libcurl库的使用(通过libcurl库下载url图像)

libcurl库的使用(通过libcurl库下载url图像)!
  • fengbingchun
  • fengbingchun
  • 2015年08月26日 18:19
  • 4901

Cocos2d-x中libcurl库的使用(1)查看库的版本信息

使用如下代码,可检测Cocos2d-x中使用的libcurl库的版本信息 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) #include "../cocos...
  • yuxikuo_1
  • yuxikuo_1
  • 2014年12月11日 14:32
  • 1872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:libcurl库介绍
举报原因:
原因补充:

(最多只允许输入30个字)