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()接收一个参数,告诉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版本信息的截图:
首先介绍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的许多属性使用字符串(以