linux c libcurl的简单使用(转)

摘要:
文档docs/libcurl/libcurl.m4告诉您如何使用这些宏。跨平台可移植代码libcurl的开发人员花费了大量精力,尽可能使libcurl在大多数平台上正常运行。全局初始化应用程序必须在使用libcurl之前初始化libcurl。当应用程序不再使用libcurl时,它应该调用curl_global_Cleanup来释放相关资源。在程序中,应避免多次调用curl _ global_ Init和curl_global_ cleanuplibcurl提供的函数是根据libcurl支持的特性在运行时开发的,这通常比编译时更好。

curl是Linux下一个非常著名的下载库,通过这个库,可以很简单的实现文件的下载等操作。
看一个简单的例子:

 1 #include <curl/curl.h>
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 CURL *curl;
 6 CURLcode res;
 7 
 8 size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
 9 {
10 if (strlen((char *)stream) + strlen((char *)ptr) > 999999) return 0;
11 strcat(stream, (char *)ptr);
12 return size*nmemb;
13 }
14 
15 char *down_file(char *filename)
16 {
17 static char str[10000000];
18 strcpy(str, “”);
19 //return “”;
20 
21 curl_easy_setopt(curl, CURLOPT_URL, filename); //设置下载地址
22 
23 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);//设置超时时间
24 
25 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);//设置写数据的函数
26 
27 curl_easy_setopt(curl, CURLOPT_WRITEDATA, str);//设置写数据的变量
28 
29 res = curl_easy_perform(curl);//执行下载
30 
31 str[9999999] = ‘0′;
32 if(CURLE_OK != res) return NULL;//判断是否下载成功
33 
34 return str;
35 }
36 
37 int main()
38 {
39 char url[200];
40 curl = curl_easy_init();//对curl进行初始化
41 
42 char *result;
43 while(fgets(url, 200, stdin)){
44 result = down_file(url);
45 if (result) puts(result);
46 else puts(“Get Error!”);
47 printf(“
Please Input a url:”);
48 
49 }
50 curl_easy_cleanup(curl);//释放curl资源
51 
52 
53 return 0;
54 }

下面是转载的curl详细使用:

curl->libcurl的手册可以查看

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA

译者:JGood(http://blog.csdn.net/JGood )

译者注:这是一篇介绍如何使用libcurl的入门教程。文档不是逐字逐句按原文翻译,而是根据笔者对libcurl的理解,参考原文写成。文中用到的一 些例子,可能不是出自原文,而是笔者在学习过程中,写的一些示例程序(笔者使用的libcurl版本是:7.19.6)。出现在这里主要是为了更好的说明 libcurl的某些api函数的使用。许多例子都参考libcurl提供的example代码。原文example中的提供的示例程序完全使用C语言, 而这里笔者提供的例子使用C++语言。因为能力有限,对于libcurl的某些理解和使用可能有误,欢迎批评指正。

目标

本文档介绍了在应用程序开发过程中,如何正确使用libcurl的基本方式和指导原则。文档使用C语言来调用libcurl的接口,当然也适用于其他与C语言接近的语言。

文档主要针对使用libcurl来进行开发的人员。文档所掼的应用程序泛指你写的源代码,这些代码使用了libcurl进行数据传输。

更多关于libcurl的功能和接口信息,可以在相关的主页上查阅。

编译源码

有很多种不同的方式来编译C语言代码。这里使用UNIX平台下的编译方式。即使你使用的是其他的操作系统,你仍然可以通过阅读本文档来获取许多有用的信息。

编译

你的编译器必须知道libcurl头文件的位置。所以在编译的时候,你要设置头文件的包含路径。可以使用curl-config工具来获取这方面的信息:

$ curl-config –cflags

链接

编译完源码(这时的源代码不是指libcurl的源代码,你是你自己写的程序代码)之后,你还必须把目标文件链接成单个可执行文件。你要链接 libcurl库,以及libcurl所依赖的其他库,例如OpenSLL库。当然可能还需要一些其他的操作系统库。最后你还要设置一些编译选项,当然可 以使用curl-config工具简化操作:

$curl-config –libs

是否使用SSL

定制编译libcurl。与其他库不同的是,libcurl可以定制编译,根据实际需要是否支持某些特性,如是否支持SSL传输,像HTTPS和 FTPS。如果决定需要支持SSL,必须在编译时正确的设置。可以使用’curl-config’来判断libcurl库是否支持SSL:

$ curl-config –feature

autoconf宏

当你编写配置脚本来检测libcurl及其相应设置时,你可以使用预定义宏。文档docs/libcurl/libcurl.m4告诉你如何使用这些宏。

跨平台的可移植的代码

libcurl的开发人员花费很大的努力,使libcurl尽可能在大多数平台上正常运行。

全局初始化

应用程序在使用libcurl之前,必须先初始化libcurl。libcurl只需初始化一次。可以使用以下语句进行初始化:

curl_global_init();

curl_global_init()接收一个参数,告诉libcurl如何初始化。参数CURL_GLOBAL_ALL 会使libcurl初始化所有的子模块和一些默认的选项,通常这是一个比较好的默认参数值。还有两个可选值:

CURL_GLOBAL_WIN32

只能应用于Windows平台。它告诉libcurl初始化winsock库。如果winsock库没有正确地初始化,应用程序就不能使用socket。在应用程序中,只要初始化一次即可。

CURL_GLOBAL_SSL

如果libcurl在编译时被设定支持SSL,那么该参数用于初始化相应的SSL库。同样,在应用程序中,只要初始化一次即可。

libcurl有默认的保护机制,如果在调用curl_easy_perform时它检测到还没有通过curl_global_init进行初始 化,libcurl会根据当前的运行时环境,自动调用全局初始化函数。但必须清楚的是,让系统自已初始化不是一个好的选择。

当应用程序不再使用libcurl的时候,应该调用curl_global_cleanup来释放相关的资源。

在程序中,应当避免多次调用curl_global_init和curl_global_cleanup。它们只能被调用一次。

libcurl提供的功能

在运行时根据libcurl支持的特性来进行开发,通常比编译时更好。可以通过调用curl_version_info函数返回的结构体来获取运行时的具 体信息,从而确定当前环境下libcurl支持的一些特性。下面是笔者在visual studio2008中调用相关函数获取libcurl版本信息的截图:
pic1

使用easy interface

首先介绍libcurl中被称为easy interface的api函数,所有这些函数都是有相同的前缀:curl_easy 。

当前版本的libcurl也提供了multi interface,关于这些接口的详细使用,在下面的章节中会有介绍。在使用multi interface之前,你首先应该理解如何使用easy interface。

要使用easy interface,首先必须创建一个easy handle,easy handle用于执行每次操作。基本上,每个线程都应该有自己的easy handle用于数据通信(如果需要的话)。千万不要在多线程之间共享同一个easy handle。下面的函数用于获取一个easy handle :

CURL *easy_handle = curl_easy_init();

在easy handle上可以设置属性和操作(action)。easy handle就像一个逻辑连接,用于接下来要进行的数据传输。

使用curl_easy_setopt函数可以设 置easy handle的属性和操作,这些属性和操作控制libcurl如何与远程主机进行数据通信。一旦在easy handle中设置了相应的属性和操作,它们将一直作用该easy handle。也就是说,重复使用easy hanle向远程主机发出请求,先前设置的属性仍然生效。

easy handle的许多属性使用字符串(以

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PMP--4. 规划过程组虹软ArcFace人脸识别 与 Dlib 人脸识别对比下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql8下载安装及配置

mysql8下载和安装 一、下载 官网地址:https://dev.mysql.com/downloads/mysql/8.0.html 选择“downloads”-->"mysql community server",如下图所示: 向下滑动页面,找到你电脑适配的版本,点击“download”,如下图: 页面跳转,不需要注册和登陆,点击“No t...

【STM32H7教程】第73章 STM32H7的SPI总线应用之驱动W25QXX(支持查询,中断和DMA)

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第73章       STM32H7的SPI总线应用之驱动W25QXX(支持查询,中断和DMA) 本章节为大家讲解标准SPI接线方式驱动W25QXX,实现了查询,中断和DMA三种方式。 73.1 初学者重要提示 73.2...

spring的后置处理器——BeanPostProcessor以及spring的生命周期

后置处理器的调用时机 BeanPostProcessor是spring提供的接口,它有两个方法——postProcessBeforeInitialization、postProcessAfterInitialization。关于这两个方法的调用时机,可以参考spring源码注释。 /** * Apply this BeanPostProc...

python 爬虫_PyQuery详细用法

总结:语法和JQuery一样 1. 初始化 from pyquery import PyQuery as pq #用pq代替pyquery doc=pq(html) print(doc('li')) #字符串的初始化 from pyquery import PyQuery as pq...

C++构造函数简单用法

个人笔记,仅供复习1.构造函数1.1 基本概念: 每个类都有构造函数,如果自己不写,编译器会生成一个默认的无参数构造函数。 构造函数名字与类名相同,可以有参数,不可以有返回值(void也不可以)。 构造函数的作用是对对象进行初始化,如给变量赋初值。 1.2 注意: 如果定义了构造函数,则编译器不生成默认的无参数构造函数。 对象生成时构造函数自动被调...

在VMware上制作一个简单的Linux

大体思路 boot root initrd.gzgrubvmlinuz-2.6.18-308.el5 bin sbin lib etc proc sys dev boot 有以上内容我们就可以运行一个非常简单的Linux,只需要往里面添加各种配置文件,就可以启动我们所需要的各种服务。在制作之前,我们先做一些准备工作。 1、在VMware上添...