linux中级——libcurl库访问百度 DATE: 2024-04-29 01:07:14
libcurl简介:
libcurl是一个跨平台的网络协议库,支持http,问百 https, ftp, gopher, telnet, dict, file, 和ldap 协议 。libcurl同样支持HTTPS证书授权,库访HTTP POST,问百 HTTP PUT, FTP 上传, HTTP基本表单上传,代理 ,库访cookies,问百和用户认证 。libcurl的库访官网 、库下载 。问百这种库使用的库访时候就像使用wiringPi库一样,编写完代码需要链接这个库 ,问百所以要先下载这个库 。库访
libcurl等第三方库的问百通用编译方法 :
- 首先进入libcurl库得下载界面,点击下载libcurl库
- 下载完成后通过共享文件夹或者FileZill或者直接拖拽将压缩包移动到虚拟机 。库访我这里将压缩包拖拽至虚拟机的问百共享文件夹 ,然后使用指令:cp /mnt/hgfs/sharefile/curl-7.71.1.tar.bz2 .将压缩包拷贝到我新建的库访httpHandler这个文件夹里面 ,然后使用指令:tar vxf curl-7.71.1.tar.bz2解压这个文件夹 ,解压后进入文件夹,如下图所示(之后用到的开源的库基本都是这样的,内容形式差不多) :
- 那么如何使用这种开源的压缩包呢?这个文件夹下面有一个README文件夹,里面有对库的一些说明,如下图所示,由下图可知,我们使用libcurl库时可以查看curl.1手册或者MANUAL document这个手册
- 这里我用有道翻译将这些英文进行了简单地翻译 : 自述 :Curl是一个命令行工具,用于传输由URL(网址)指定的数据语法。通过阅读curl了解如何使用curl 。手册页或手册文档。通过阅读install了解如何安装Curl文档。Libcurl是curl用来完成其工作的库 。它很容易可被您的软件使用。阅读libcurl。3手册页学习如何!你可以在FAQ文档中找到最常见问题的答案 。研究copy文件中的分发条款和类似条款。如果你分配Curl二进制文件或其他涉及libcurl的二进制文件,您可能会喜欢LICENSE-MIXING文档。所有这些文档以及更多文档都可以在docs/目录中找到。联系:如果您有问题 、疑问、想法或建议,请与我们联系通过邮寄到一个合适的邮寄名单 。参见http//curl.haxx.se/mail/该项目的所有贡献者都列在THANKS文档中。网站:访问curl网站获取最新消息和下载:https://curl.haxx.se/ ,GIT:要从GIT服务器上下载最新的源代码,请这样做:git克隆https://github.com/curl/curl.git,(您将创建一个名为curl的目录,并填充源代码)。安全问题 :通过我们的HackerOne页面报告可疑的安全问题 ,而不是在公共场合!https://hackerone.com/curl请注意 :Curl包含的源代码是版权所有©1998, 1999。终于Tekniska Hogskolan。在此附上此通知是为了遵守分布条件 。
- 通过阅读README我们并没有找到如何使用这个库,然后进入到docs这个文件夹,这个文件夹是对RADME的一个补充,在这个文件夹下面我们会看到README里面提到的curl1.1这个API相关的手册,还有INSTALL(**==这个一定要看 ,有时候他会和README都放在解压后的文件夹里面 ,有时候会放在docs里面==**) 。
- 打开INSTALL后看到 提示说如何编译(compile)这个库请看INSTALL.md这个文件,打开这个文件后,里面有介绍如何安装编译后的libcurl库 ,然后下面可以看到在UNIX环境下面如何进行安装 如下图所示,**./config就是配置的一个东西,就是将库安装到哪里 ,若后面不跟任何的参数,就是默认安装(可能安装在/usr/lib或者/usr/include下面) 。** ==make就是编译的意思 ,make install就是将编译后的东西拷贝到根目录的相关文件夹下面。如果默认安装的话可能需要root权限== 因为:默认可能安装在/usr/lib或者/usr/include下面,而访问这两个文件夹需要root权限。
在这里插入图片描述
- 当然一般不安装在默认的路径下面 ,可以通过下图方式指定安装路径
- 通过指令:./configure --help可以查看configure都支持哪些功能参数,其中下面的HOST这个指令可以指定交叉编译的编译器(若不指定交叉编译工具默认使用gcc编译工具) 。
- 通过以下指令:./configure --prefix=$PWD/_install进行指定位置的安装 ,安装的时候会生成一个_install文件夹 ,库将会被安装到这个文件夹下面,安装过程中没有出现任何error表示安装成功 ,然后使用指令 :make进行编译 ,然后使用使用指令 :make install进行拷贝 ,然后会发现当前文件夹下面生成了一个_install文件夹 ,然后进入到该文件夹,如下图所示 :
在这里插入图片描述
调用libcurl库访问百度
调用libcurl库访问百度主页并将数据保存到文件中 :程序代码:
#include <stdio.h>n#include <curl/curl.h>nn#define true 1n#define false 0ntypedef unsigned int bool;nnbool getUrl(char *filename)n{ n CURL *curl;n CURLcode res;n FILE *fp;n if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储n return false;n struct curl_slist *headers = NULL;n headers = curl_slist_append(headers, "Accept: Agent-007");n curl = curl_easy_init(); // 初始化n if (curl)n { n //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头n curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");n curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件n curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件n res = curl_easy_perform(curl); // 执行n if (res != 0) { nn curl_slist_free_all(headers);n curl_easy_cleanup(curl);n }n fclose(fp);n return true;n }n}nbool postUrl(char *filename)n{ n CURL *curl;n CURLcode res;n FILE *fp;n if ((fp = fopen(filename, "w")) == NULL)n return false;n curl = curl_easy_init();n if (curl)n { n curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容n //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");n curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定urln curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);n res = curl_easy_perform(curl);n curl_easy_cleanup(curl);n }n fclose(fp);n return true;n}nint main(void)n{ n getUrl("/tmp/get.html");n postUrl("/tmp/post.html");n}n
大概解读代码 : 要用一个是getUrl ,一个是postUrl,用get跟post两种方法来请求的一个网页 。 getUrl,我们来看一下,是自己封装的这个函数,fopen这个函数去打开了一个文件,放在fp这个流里面。然后curl_easy_init去做初始化,去初始化我们的curl引擎 ,初始化成功以后curl_easy_setopt去设置curl相关的项 ,包括我们要访问的IP地址等等,还有一个CURLOPT_WRITEDATA 。访问成功数据返回以后呢会把数据流导入到这个filename这个文件里面,那filename文件是哪里呢?在/tmp/get.html 。这文件如果没有的话,他这边fp = fopen(filename, "w")应该会创建啊,去回顾一下文件相关的操作 。然后将返回的 html主体数据输出到fp指向的文件