libcurl库的安装和使用

libcurl简介:
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。libcurl的官网 、库下载。这种库使用的时候就像使用wiringPi库一样,编写完代码需要链接这个库,所以要先下载这个库。

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()释放内存

libcurl等第三方库的通用编译方法:

  • 首先进入libcurl库得下载界面,点击下载libcurl库
    在这里插入图片描述

  • 下载完成后通过共享文件夹或者FileZill或者直接拖拽将压缩包移动到虚拟机。我这里将压缩包拖拽至虚拟机的桌面,然后使用指令:mv ~/Desktop/curl-7.71.1.tar.bz2 .(~表示工作路径就是/home/fhn这个路径)将压缩包移动到我新建的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库访问百度主页并将数据保存到文件中:

程序代码:

#include <stdio.h>
#include <curl/curl.h>
#define true 1
#define false 0
typedef unsigned int bool;
bool getUrl(char *filename)
{CURL *curl;CURLcode res;FILE *fp;if ((fp = fopen(filename, "w")) == NULL)  // 返回结果用文件存储return false;struct 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); //将返回的html主体数据输出到fp指向的文件res = curl_easy_perform(curl);   // 执行if (res != 0) {curl_slist_free_all(headers);curl_easy_cleanup(curl);}fclose(fp);return true;}
}
int main(void)
{getUrl("/tmp/get.html");
}
  • 使用指令:gcc demo1.c -o demo1 -I ~/httphandler/curl-7.71.1/_install/include -L ~/httphandler/curl-7.71.1/_install/lib/ -lcurl进行编译,-I是指定头文件的查找路径,-L是指定库文件的查找路径,同时还要-l curl,编译后的执行文件在执行的时候出现以下图中错误:因为在程序执行的时候,默认去/usr/lib去找库,然而没有找到,所以我们要设置动态库的环境遍变量:使用指令:export LD_LIBRARY_PATH=库的路径,这种方法临时有效,永久生效的环境变量设置,编辑/etc/profile即可。也可以修改工作目录下的.bashrc 文件。

在这里插入图片描述

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

libcurl库函数介绍:

  • curl_global_init(long flags)函数:
CURLcode curl_global_init(long flags)功能:初始化libcurl
这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它将由libcurl库自动调用
所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的,、
所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。参数:flags
CURL_GLOBAL_ALL                      //初始化所有的可能的调用。
CURL_GLOBAL_SSL                      //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32            //初始化win32套接字库。
CURL_GLOBAL_NOTHING         //没有额外的初始化。
  • 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函数)参数:
1 CURL类型的指针
2 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)
3 parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数.
CURLoption 这个参数的取值很多.具体的可以查看man手册.
  • CURLcode curl_easy_perform(CURL * handle)函数: 在初始化CURL类型的指针以及curl_easy_setopt完成后调用. 就像字面的意思所说perform就像是个舞台.让我们设置的option 运作起来.参数:CURL类型的指针.

curl_easy_setopt函数部分选项介绍:
本节主要介绍curl_easy_setopt中跟http相关的参数。该函数是curl中非常重要的函数,curl所有设置都是在该函数中完成的,该函数的设置选项众多,注意本节的阐述的只是部分常见选项。

  • CURLOPT_URL 设置访问URL。比如:curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com")

  • CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA
    回调函数原型为:size_t function( void *ptr, size_t size, size_t nmemb, void *stream); 函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能,如处理下载文件。CURLOPT_WRITEDATA 用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源。如果你没有通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出。你也可以通过 CURLOPT_WRITEDATA属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里。

  • CURLOPT_HEADERFUNCTIONCURLOPT_HEADERDATA
    回调函数原型为 size_t function( void *ptr, size_t size,size_t nmemb, void *stream); libcurl一旦接收到http 头部数据后将调用该函数。CURLOPT_WRITEDATA 传递指针给libcurl,该指针表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。

  • CURLOPT_READFUNCTIONCURLOPT_READDATA
    libCurl需要读取数据传递给远程主机时将调用CURLOPT_READFUNCTION指定的函数,函数原型是:size_t function(void *ptr, size_t size, size_t nmemb,void *stream). CURLOPT_READDATA 表明CURLOPT_READFUNCTION函数原型中的stream指针来源。

  • CURLOPT_NOPROGRESSCURLOPT_PROGRESSFUNCTIONCURLOPT_PROGRESSDATA
    跟数据传输进度相关的参数。CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次,为了使CURLOPT_PROGRESSFUNCTION被调用,CURLOPT_NOPROGRESS必须被设置为false,CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的第一个参数, -

  • CURLOPT_TIMEOUTCURLOPT_CONNECTIONTIMEOUT:
    CURLOPT_TIMEOUT 由于设置传输时间,CURLOPT_CONNECTIONTIMEOUT 设置连接等待时间

  • CURLOPT_FOLLOWLOCATION,设置重定位URL

curl_easy_perform 函数说明(error 状态码):
该函数是完成curl_easy_setopt指定的所有选项,本节重点介绍curl_easy_perform的返回值。返回0意味一切ok,非0代表错误发生。主要错误码说明:

  • CURLE_OK 任务完成一切都好
  • CURLE_UNSUPPORTED_PROTOCOL 不支持的协议,由URL的头部指定
  • CURLE_COULDNT_CONNECT 不能连接到remote 主机或者代理
  • CURLE_REMOTE_ACCESS_DENIED 访问被拒绝
  • CURLE_HTTP_RETURNED_ERROR Http返回错误
  • CURLE_READ_ERROR 读本地文件错误
    要获取详细的错误描述字符串,可以通过const char *curl_easy_strerror(CURLcode errornum ) 这个函数取得.

参考博文:http协议之libcurl

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 微信缩小通话界面_安卓如何做出微信那样的界面仿微信“我”的界面2/5...

本系列目标通过安卓编程仿写微信“我”的界面,让大家也能做出类似微信界面.效果图如下:本文目标做出支付部分(其他部分在后续文章中逐步分享).效果图如下:实现方案通过截图工具或者下载一张微信支付照片,放到工程的src/main/res/drawable目录下,命名为pay.png;同样获取一张向右…

Shell脚本中函数的定义和调用笔记

Shell脚本函数的作用主要是把一些可以通用的功能封装起来、避免脚本中出现大量重复的脚本代码&#xff0c;同时可以大大增强脚本的可读性、和可维护性。Shell函数定义的语法格式&#xff1a;function FUNCTION_NAME(){command1command2command3}也可以省略function 关键字FUNCT…

opensll、libcurl库安装的使用,树莓派CSI摄像头的配置,树莓派调用智能API平台实现人脸识别、树莓派配置中文环境

接着上一节人工智能翔云平台介绍&#xff1a; 人工智能OCR识别&#xff1a; OCR 是英文Optical Character Recognition的缩写&#xff0c;意思是光学字符识别&#xff0c;也可简单地称为文字识别&#xff0c;是文字自动输入的一种方法。它通过 扫描 和摄像等光学输入方式获取纸…

Shell脚本中函数返回值的用法笔记

函数的返回值又可以称为函数的退出状态&#xff0c;实际上可以理解为一种通信方式。Shell脚本中函数可以使用返回值的方式把调用的结果信息反馈给调用者。便于调用者可以根据反馈的结果做相应处理。说明&#xff1a;函数的返回值主要使用 return 关键字来处理。这和很多编程语言…

python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码

首先对Probabilistic Matrix Factorization这篇论文的核心公式进行讲解和推导&#xff1b;然后用Python代码在Movielens数据集上进行测试实验。一、 背景知识文中作者提到&#xff0c;传统的协同过滤算法有两个不足&#xff1a;1).不能很好地处理规模非常大的数据&#xff1b;2…

JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)

运行第一个JAVA程序&#xff1a; 这里使用的开发环境是eclipse&#xff0c;新建一个java工程&#xff0c;然后可以看到src这个是存放java代码的地方&#xff0c;然后在src文件右击新建一个class&#xff08;类&#xff09;&#xff0c;然后可以看到下图&#xff0c;同样和C语言…

unity中如何解决镜头穿透模型?

设置相机的Near clip plane,调小一点,但是不要给负数就行。 转载于:https://www.cnblogs.com/ZeroMurder/p/5331174.html

Shell脚本中函数位置参数的用法笔记

位置参数主要是用于调用函数的时候有时候需要传递参数&#xff0c;有很大的比例都是需要调用函数的时候动态传递参数&#xff0c;从而实现相应的功能。比如我想要计算两个数的和&#xff0c;可以通过函数是实现&#xff0c;需要定义两个参数作为计算的值。这样的计算两个数的函…

生鲜配送小程序源码_生鲜社区团购配送系统小程序源码搭建平台模式

生鲜配送系统开发&#xff0c;找【金生157威6875店2419同号】生鲜配送模式开发&#xff0c;生鲜配送软件开发&#xff0c;生鲜配送APP开发&#xff0c;生鲜配送平台开发平台&#xff0c;生鲜配送系统源码开发平台&#xff0c;生鲜配送系统平台&#xff0c;生鲜配送系统定制开发…

继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类

这篇博客将会涉及到&#xff1a; 继承的概念和实现super关键字方法重写—OverrideObject常见方法 继承的概念&#xff1a; 生活中&#xff0c;继承的概念随处可见&#xff0c;继承需要符合的关系&#xff1a;is-a&#xff1b;父类更通用、子类更特殊更具体。就比如说&#x…

盘点关于程序员的10个有趣的段子

&#xff08;1&#xff09;程序员的读书历程&#xff1a;x 语言入门 —> x 语言应用实践 —> x 语言高阶编程 —> x 语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅—> 颈椎病康复指南。&#xff08;2&#xff09;程序员最讨厌的四件事&#x…

Linux 用户管理命令笔记

目录 1、新增用户 2、删除用户 3、修改用户 4、修改用户密码 1、新增用户 useradd user1 用户创建流程 1、系统先将用户信息记录在/etc/passwd中&#xff0c;一般会在/etc/passwd和/etc/shadow末尾,同时分配该用户UID。 2、创建用户目录&#xff0c;一般创建路径/home目录中。…

tomcat依赖导入步骤_Tomcat长生不老之术——嵌入式

前言Tomcat是一个非常流行的Web服务器&#xff0c;用于部署和运行Java Web应用程序。一般情况下&#xff0c;我们都是在单独的Tomcat实例上运行自己的Web应用&#xff0c;其实与这种经典方案相比&#xff0c;我们可以将服务器运行时直接集成到应用程序中&#xff0c;从而更加的…

Linux用户组笔记整理

目录 一、Linux用户组概念 二、常用命令 三、用户组信息存储位置 一、Linux用户组概念 Linux用户组&#xff08;group&#xff09;就是具有相同操作权限范围的Linux用户管理起来&#xff1b; 比如有时我们要让同一类用户具有相同的权限&#xff0c;比如查看、修改某一文件或执…