libcurl介绍:libcurl是一个跨平台的网络协议库,支持http、https、ftp、gopher、telnet、dict、file、ldap协议。libcurl还支持HTTPS证书授权、HTTPPOST、HTTPPUT、FTP上传、HTTP基本表单上传、代理、cookie和用户身份验证。Libcurl的官网,库下载。使用这个库时,就像使用wiringPi库一样。写好代码后,需要链接这个库,所以必须先下载这个库。libcurl等第三方库的一般编译方法:首先进入libcurl库的下载界面,点击下载libcurl库。下载完成后,通过共享文件夹或FileZill或直接拖拽将压缩包移动到虚拟机中。这里我把压缩包拖到虚拟机的共享文件夹中,然后使用命令:cp/mnt/hgfs/sharefile/curl-7.71.1.tar.bz2。将压缩包复制到我新建的httpHandler文件夹中,然后使用命令:tarvxfcurl-7.71.1.tar.bz2解压该文件夹,解压后进入该文件夹,如下图(开源的后面用到的库基本都是这样,内容也差不多)。那么如何使用这个开源压缩包呢?该文件夹下有一个README文件夹,里面包含了库的一些说明,如下图所示。从下图可以看出,我们在使用libcurl库的时候,可以查看curl.1手册或者MANUAL文档手册。这里我用有道翻译器简单翻译一下这些英文单词:Readme:Curl是一个命令行工具,用于传输URL(网址)指定的数据语法。通过阅读curl了解如何使用curl。手册页或手册文档。通过阅读安装了解如何安装Curl文档。Libcurl是curl用来完成其工作的库。您的软件可以轻松使用它。阅读有关libcurl的信息。3个手册页来学习如何操作!您可以在常见问题解答文档中找到最常见问题的答案。研究副本文件中的分发术语和类似术语。如果您分发Curl二进制文件或其他涉及libcurl的二进制文件,您可能会喜欢LICENSE-MIXING文档。所有这些文档以及更多内容都可以在docs/目录中找到。联系方式:如果您有疑问、问题、想法或建议,请通过邮寄到适当的邮件列表与我们联系。请参阅http//curl.haxx.se/mail/该项目的所有贡献者都列在THANKS文档中。网站:访问curl网站以获取最新消息和下载:https://curl.haxx.se/,GIT:要从GIT服务器下载最新的源代码,请执行以下操作:gitclonehttps://github.com/curl/curl.git,(您将创建一个名为curl的目录,其中包含源代码)。安全问题:通过我们的HackerOne页面而不是公开报告可疑的安全问题!https://hackerone.com/curl请注意:Curl附带的源代码版权所有?1998、1999。最后是TekniskaHogskolan。特此附上本通知,以遵守分发条件。通过阅读README,我们并没有搞清楚这个库的使用方法,然后进入了docs文件夹,这是对RADME的一个补充。在此文件夹下,我们将看到README中提到的curl1.1API。Themanual,andINSTALL(**==这个一定要看,有的时候会放在解压后的文件夹里跟README,有的时候会放在docs里==**)。打开INSTALL后,会看到一个提示,说如何编译(compile)这个库。请参考INSTALL.md文件。打开这个文件后,有关于如何安装编译好的libcurl库的介绍,然后就可以看到在UNIX环境下如何安装了。如下图,**./config是配置的东西,就是把库安装到哪里,如果后面不带任何参数,默认安装(可能安装在/usr下/lib或/usr/include)。**==make的意思是编译,makeinstall的意思是把编译好的东西拷贝到根目录的相关文件夹中。如果默认安装,可能需要root权限==因为:默认可能安装在/usr/lib或/usr/include下,访问这两个文件夹需要root权限。当然一般不会安装在默认路径下。您可以通过下图指定安装路径。通过命令:./configure--help可以查看configure支持哪些功能参数。下面的HOST命令可以指定交叉编译编译器(如果不指定交叉编译工具,默认使用gcc编译工具)。使用以下命令:./configure--prefix=$PWD/_install在指定位置安装。安装时会生成一个_install文件夹,库会安装在这个文件夹下。安装过程中没有报错。说明安装成功,然后使用命令:make编译,然后使用命令:makeinstall复制,然后会发现在当前文件夹下生成了一个_install文件夹,然后进入这个文件夹,as如下图所示:调用libcurl库访问百度调用libcurl库访问百度首页并将数据保存到文件中,程序代码:#include#include#definetrue1#definefalse0typedefunsignedintbool;boolgetUrl(char*filename){CURL*curl;CURLcode资源;文件*fp;if((fp=fopen(filename,"w"))==NULL)//将结果存储在文件中returnfalse;结构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);//将返回的htmlbody数据输出到fp指向的文件中res=curl_easy_perform(curl);//执行if(res!=0){curl_slist_free_all(headers);curl_easy_cleanup(curl);}fclose(fp);返回真;}}boolpostUrl(char*文件名){CURL*curl;CURLcode资源;文件*fp;如果((fp=fopen(文件名,“w”))==NULL)返回false;curl=curl_easy_init();如果(curl){curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"/tmp/cookie.txt");//指定cookie文件curl_easy_setopt(curl,CURLOPT_POSTFIELDS,"&logintype=uid&u=xieyan&psw=xxx86");//指定帖子内容//curl_easy_setopt(curl,CURLOPT_PROXY,"10.99.60.201:8080");curl_easy_setopt(curl,CURLOPT_URL,"http://mail.sina.com.cn/cgi-bin/login.cgi");//指定urlcurl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);res=curl_easy_perform(curl);curl_easy_cleanup(卷曲);}fclose(fp);returntrue;}intmain(void){getUrl("/tmp/get.html");postUrl("/tmp/post.html");}大致解读一下代码:一个是getUrl,一个是postUrl,通过get和post两种方法请求的一个网页getUrl,看一下,是封装的函数fopen函数本身会打开一个文件并将其放入fp流中。然后curl_easy_init进行初始化,初始化我们的curl引擎,初始化成功后,curl_easy_setopt设置curl相关的项目,包括我们要访问的IP地址等,还有一个CURLOPT_WRITEDATA。返回访问成功数据后,将数据流导入filename。文件名文件在哪里?在/tmp/get.html中。如果文件不存在,这里应该创建fp=fopen(filename,"w"),我们再回顾一下文件相关的操作。然后将返回的htmlbody数据输出到fp指向的文件,将百度访问的所有结果写入文件**,然后执行curl_easy_perform即可访问百度。如果res!=0,这个res不等于0是什么意思?你是什??么意思?我们再回顾一下前面提到的http请求后的返回值。如果请求成功,我们将释放相关的curl句柄。并关闭这个文件,返回true;访问成功,这是相关步骤。使用命令:gccdemo1.c-I./curl-7.71.1/_install/include/-L./curl-7.71.1/_install/lib/-lcurl进行编译,**-I是搜索指定头文件Path,-L是指定库文件的搜索路径,还需要-lcurl,编译后的可执行文件执行时出现如下错误:因为程序执行的时候去/usr/lib默认找库**,但是没有找到,所以我们需要设置动态库的环境变量:使用命令:exportLD_LIBRARY_PATH=库的路径,此方法暂时有效,永久环境变量可以在/etc/profile中编辑设置。您还可以修改工作目录中的.bashrc文件。Linux动态库、静态库。通过上面的设置然后执行程序:可以看到/tmp/get.html文件夹中包含了从百度网页获取的html代码:libcurl库函数介绍:curl_global_init(longflags)函数:使用libcurl(实际上类似于套接字编程一如既往,需要某些步骤):调用curl_global_init()来初始化libcurl(就像初始化套接字一样)。调用curl_easy_init()函数得到一个easy接口指针(这个指针用于各种配置)。调用curl_easy_setopt()设置传输选项(通过调用curl_easy_setopt函数配置各种指针,如:请求方式)。实施回调函数以根据curl_easy_setopt()设置的传输选项完成用户特定的任务。调用curl_easy_perform()函数发出访问请求。调用curl_easy_cleanup()释放内存。函数介绍CURLcodecurl_global_init(longflags)功能:初始化libcurl该函数只能使用一次。(其实调用curl_global_cleanup函数后还是可以使用的)如果调用curl_easy_init函数时这个函数还没有调用过,会被libcurl库自动调用,所以最好在multi下主动调用这个函数-threading以防止在线程中的curl_easy_init期间多次调用。注意:虽然libcurl是线程安全的,但是curl_global_init并不能保证线程安全,所以不要在每个线程都调用curl_global_init,应该在主线程调用这个函数。参数:flagsCURL_GLOBAL_ALL//初始化所有可能的调用。CURL_GLOBAL_SSL//初始化对安全套接字层的支持。CURL_GLOBAL_WIN32//初始化win32套接字库。CURL_GLOBAL_NOTHING//没有额外的初始化。voidcurl_global_cleanup(void)函数:当libcurl使用完毕后,用于清理curl_global_init所做的工作。类似于关闭的功能。注意:虽然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*object),一般用在easy系列的函数中。voidcurl_easy_cleanup(CURL*handle)函数:此调用用于结束会话。它与curl_easy_init结合使用。参数:CURL类型指针。CURLcodecurl_easy_setopt(CURL*handle,CURLoptionoption,parameter)函数:这个函数是最重要的。几乎所有的curl程序都经常使用它。它告诉curl库程序将如何运行。比如查看一个网页的HTML代码等(这个功能有点像ioctl功能)。参数:CURL类型的指针。各种CURLoption类型的选项。(都在curl.h库中定义,也可以在man中查看)。parameter此参数可以是指向函数的指针、指向对象的指针或长变量。它使用什么取决于第二个参数。CURLoption这个参数有很多取值。有关详细信息,请参阅手册。CURLcodecurl_easy_perform(CURL*handle)函数;在初始化CURL类型的指针并完成curl_easy_setopt后调用。正如字面意思所说,表演就像一个舞台。让我们设置的选项起作用。参数:CURL类型的指针。