欢迎来到 陇南市某某环保机械设备教育中心
全国咨询热线:020-123456789
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

新闻中心
linux中级——libcurl库访问百度
  来源:陇南市某某环保机械设备教育中心  更新时间:2024-05-05 00:00:32

linux中级——libcurl库访问百度


linux中级——libcurl库访问百度


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权限。
linux中级——libcurl库访问百度

在这里插入图片描述

  • 当然一般不安装在默认的路径下面,可以通过下图方式指定安装路径
  • 通过指令:./configure --help可以查看configure都支持哪些功能参数 ,其中下面的HOST这个指令可以指定交叉编译的编译器(若不指定交叉编译工具默认使用gcc编译工具)。
  • 通过以下指令:./configure --prefix=$PWD/_install进行指定位置的安装 ,安装的时候会生成一个_install文件夹 ,库将会被安装到这个文件夹下面,安装过程中没有出现任何error表示安装成功 ,然后使用指令 :make进行编译 ,然后使用使用指令 :make install进行拷贝,然后会发现当前文件夹下面生成了一个_install文件夹 ,然后进入到该文件夹  ,如下图所示:
linux中级——libcurl库访问百度

在这里插入图片描述

调用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 ,用getpost两种方法来请求的一个网页。 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指向的文件,**百度的访问的所有结果往文件里面去写** ,然后curl_easy_perform执行就是在访问百度 ,如果res != 0 ,这个res不等于零是啥意思呢?我们去回顾一下之前提到的这个进行http请求以后的一个返回值 ,如果请求成功以后啊,我们去释放这相关的curl的这个句柄 。并且关闭这个文件 ,return true;访问成功 ,这个是相关的步骤

  • 使用指令: gcc demo1.c -I ./curl-7.71.1/_install/include/ -L./curl-7.71.1/_install/lib/ -lcurl进行编译  ,**-I是指定头文件的查找路径,-L是指定库文件的查找路径,同时还要-l curl,编译后的执行文件在执行的时候出现以下图中错误: 因为在程序执行的时候 ,默认去/usr/lib去找库** ,然而没有找到 ,所以我们要设置动态库的环境遍变量:使用指令 :export LD_LIBRARY_PATH=库的路径 ,这种方法临时有效,永久生效的环境变量设置,编辑/etc/profile即可。也可以修改工作目录下的.bashrc 文件  。 linux动态库,静态库

通过以上设置然后再执行程序:可以看到/tmp/get.html这个文件夹里面有从百度网页获取的html代码:

linux中级——libcurl库访问百度

libcurl库函数介绍:

curl_global_init(long flags)函数:

libcurl的使用(其实和socket编程时一样 ,都需要一定的步骤):

调用curl_global_init()初始化libcurl ,(就像初始化套接字)

调用curl_easy_init()函数得到 easy interface型指针(这个指针用来各种配置)

调用curl_easy_setopt()设置传输选项(通过调curl_easy_setopt这个函数来对指针进行各种配置,比如:请求的方式)

根据curl_easy_setopt()设置的传输选项 ,实现回调函数以完成用户特定任务

调用curl_easy_perform()函数进行访问请求

调用curl_easy_cleanup()释放内存

函数简介

CURLcode curl_global_init(long flags) 功能:初始化libcurl这个函数只能用一次 。(其实在调用curl_global_cleanup 函数后仍然可再用) 如果这个函数在curl_easy_init函数调用时还没调用 ,它将由libcurl库自动调用所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。

注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的 , 所以不要在每个线程中都调用curl_global_init ,应该将该函数的调用放在主线程中 。

参数:flagsnCURL_GLOBAL_ALL //初始化所有的可能的调用 。nCURL_GLOBAL_SSL //初始化支持 安全套接字层。nCURL_GLOBAL_WIN32 //初始化win32套接字库。nCURL_GLOBAL_NOTHING //没有额外的初始化。n

  • void curl_global_cleanup(void)函数 : 结束libcurl使用的时候 ,用来对curl_global_init做的工作清理 。类似于close的函数  。注意 :虽然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*对象), 一般都用在easy系列的函数中.
  • void curl_easy_cleanup(CURL * handle) 函数 : 这个调用用来结束一个会话.与curl_easy_init配合着用. 参数: CURL类型的指针.

CURLcode curl_easy_setopt(CURL * handle, CURLoption option,parameter)函数  :

这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.(这个函数有些像ioctl函数)

参数:

CURL类型的指针

各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)

parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数. CURLoption 这个参数的取值很多.具体的可以查看man手册.

  • CURLcode curl_easy_perform(CURL *handle)函数; 在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform就像是个舞台.让我们设置的 option 运作起来.参数: CURL类型的指针.

友情链接再见,神奇小子!拜仁官宣齐尔克泽离队,850万欧加盟博洛尼亚韦德力挺,15岁儿子变性成功,进模特圈,和白人男友交往曼联这新援是“高级货”!一脚长传破局+单刀自己不射,0身价超值法甲-梅西两度助攻姆巴佩双响 门德斯建功 巴黎3-0客胜十人南特历届美国梦之队战力榜!梦一无悬念登顶,梦八能够排在第几位?3次被过+14次传球失误!曼联7000万先生现原形,皇马赚大了偷着乐皇马清洗4000万攻击手,5000万锋霸就位,皇马阵容升级那不勒斯 VS 利物浦巴黎手握续约三大优势,核心有望成功续约,被换下却笑容满面欧国联-西班牙1-2不敌瑞士 阿坎吉传射索默屡献神扑 阿尔巴破门1-4!欧冠8.8亿豪阵被吊打,绝佳机会1-9,克洛普脸色难看17年首次!C罗赛季前5场0进球1-1到3-1!皇马拒绝爆冷:1亿巨星2场造3球,安切洛蒂神换人1-1!尤文客场战平死敌,开局5轮不败!新援闪击,门将扑点立功英超-切尔西2-1逆转西汉姆 奇尔韦尔传射 哈弗茨第88分钟绝杀来个痛快的?胡梅尔斯:我希望欧冠抽签能抽进最难的小组郑智回归首败出炉:24岁国脚失误,广州队1-2,河南队4场首胜“第一位跳水女皇”高敏:22岁退役,曾想过轻生,52岁再次跳水1-3,终于输了!英超第1倒下,20冠豪门爆发,甩开2劲敌+剑指欧冠世预赛-刚果(金)45-57不敌突尼斯 库明加得到19分8篮板8失误法国队世界杯遭打击!博格巴需养伤60天出战成疑 回归尤文需等明年官宣 | 2023赛季F1赛历发布,全年24场比赛创历史之最一个人就是一支球队!哈兰德当前进球数比15支英超球队都多英超琅琊射手榜中甲最新积分榜:海牛急刹车,江苏双雄优势扩大,江西绝平上海日羽赛半决赛中国队连遭打击,陈雨菲凡尘落败,雅思结束38连胜“不可一世”的宁泽涛,为何走到了今天这一步?穆里尼奥获葡萄牙足协教练奖重罚1.72亿!欧足联官宣,穆里尼奥要回来了盘点曾在主流顶级联赛留洋的中国球员,谁的成就更大?热身赛-内马尔助攻双响 理查利森梅开二度 巴西3-0完胜加纳相较于曼联喜提三连胜,拉什福德的意识转变更令人感到欣慰球队实力哪家强?美媒评比新赛季NBA实力排行榜:勇士仅排第五罗马0:4客场惨败乌迪内斯,穆里尼奥罕见战术完败,该下决心了女排世锦赛首个冷门!泰国队3比2击败土耳其,第四局变阵收到奇效谁上谁尴尬头号种子爆冷出局!世界冠军1:3被淘汰,国乒独苗与韩国争夺冠军费纳明晨合体出战拉沃尔杯,费德勒敞开心扉再谈GOAT之争切尔西官宣压哨引援:巴萨前锋奥巴梅扬加盟蓝军,签约2年有史以来,影响力最大的足球运动员是谁?
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

0.2369

Copyright © 2024 Powered by 陇南市某某环保机械设备教育中心   sitemap