1.libcurl简介

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证

libcurl的官网 http://curl.haxx.se/

库下载https://github.com/curl/curl/releases/tag/curl-7_71_1

2.libcurl的使用

初始化libcurl:

curl_global_init()

函数得到 easy interface型指针:

curl_easy_init()

设置传输选项:

curl_easy_setopt()

设置的传输选项,实现回调函数以完成用户特定任务:

curl_easy_setopt()

函数完成传输任务:

curl_easy_perform()

释放内存:

curl_easy_cleanup()

函数简介

1.CURLcode curl_global_init(long flags);函数只能用一次。(其实在调用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 //没有额外的初始化。

CURL类型的指针.

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

1. CURLOPT_URL

设置访问URL

2. CURLOPT_WRITEFUNCTION,CURLOPT_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属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里。

3. CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA

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

4. CURLOPT_READFUNCTION CURLOPT_READDATA

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

5. CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA

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

6. CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:

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

7. CURLOPT_FOLLOWLOCATION

设置重定位URL

我们直接参考该文章代码测试学习一下
参考文章

3.准备libcurl库

先将下载得到的libcurl库拿到Linux系统下,拖拽或FileZilla

1.处理libcurl库

先创建一个文件夹,拷贝到里面解压

tar xvf curl-7.71.1.tar.bz2

使用libcurl库

进入解压后的文件夹后,有各种使用介绍,README,doc下文件,
全都是英文,可以进行阅读,我们要快速开发,也可以借助百度去查看函数的使用,这样更方便,具体参考上文中引用的文章
有能力的话,去看一下INSTALL下的dosc文件夹下的INSTALL.md
我们主要参考Unix 安装
若需交叉编译,请参考

https://blog.csdn.net/weixin_46016743/article/details/112879108?spm=1001.2014.3001.5501

1.配置configure

./configure --prefix=$PWD/_install

若需指定编译工具即交叉编译

./configure --prefix=$PWD/_install  --host= (编译工具)

./configure --prefix=$PWD/_install  --host= arm-linux-gnueabihf-gcc

默认使用gcc

如要求助:

./configure -help

2.编译 make

make

没有error提示,但依然没有生成install,继续

3.安装

make install

完成,现在我们可以调用lib下面的动态库,静态库去实现线面代码
动态库,静态库的使用参考
动态库,静态库

4. 代码测试

我们首先处理一下C语言不兼容问题
布尔类型,和true和falseC语言不支持

简单测试

#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;}
}
bool postUrl(char *filename)
{CURL *curl;CURLcode res;FILE *fp;if ((fp = fopen(filename, "w")) == NULL)return false;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");    // 指定post内容//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(curl);}fclose(fp);return true;
}
int main(void)
{getUrl("/tmp/get.html");postUrl("/tmp/post.html");
}

直接是无法使用的
先配置一下环境变量

declare -x LD_LIBRARY_PATH="./curl-7.71.1/_install/lib/"

./a.out运行 无现象

vi /tmp/get.html

可打开获取的百度网页,当然无界面的,全是代码形式,和我们查看网页的代码的内容是一样的

直接掉到./a.out实现

#include <stdio.h>
#include <curl/curl.h>
#include<string.h>#define true 1
#define false 0
typedef unsigned int bool;size_t testreadData( void *ptr, size_t size, size_t nmemb)
{char Buf[1024] = {'\0'};strncpy(Buf,ptr,1024);printf("============================get data============================");printf("%s\n",Buf);
}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_WRITEFUNCTION, testreadData);//       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;}
}
bool postUrl(char *filename)
{CURL *curl;CURLcode res;FILE *fp;if ((fp = fopen(filename, "w")) == NULL)return false;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");    // 指定post内容//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(curl);}fclose(fp);return true;
}
int main(void)
{getUrl("/tmp/get.html");postUrl("/tmp/post.html");
}

结果

可以设置更大的空间 去读取更多的内容

具体操作 实现 参照这些内容

https://www.cnblogs.com/xietianjiao/p/13260021.html

libcurl简单介绍和使用相关推荐

  1. libcurl 基础介绍

    一.LibCurl基本编程框架 libcurl 是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcur ...

  2. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  3. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  4. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  5. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  6. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  7. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  8. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  9. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

最新文章

  1. pcre安装_Nginx学习_第一期_安装及安装问题解决
  2. 华为交换机ssh思科交换机_使用SSH或Telnet访问思科业务交换机CLI
  3. solr从数据库为solr_home导入数据
  4. 回顾 | Kubernetes SIG-Cloud-Provider-Alibaba 首次网研会(含 PPT 下载)
  5. python图片解析库_python用来获得图片exif信息的库实例分析
  6. linux 远程链接数据库报错host *** is not allowed to connect to this mysql server
  7. typedef struct 和 struct 的区别
  8. 【Ubuntu】Ubuntu16.04安装火狐浏览器中国版
  9. 《操作系统原理》课程中涉及的数据结构总结
  10. 易绍坤网络赚钱:淘宝客获取佣金网赚之路,该如何进行?
  11. cwRsync文件同步
  12. 基于STM32F103的消防系统之火焰传感器
  13. 债券收益率建模(时间序列建模)时间序列相似度度量
  14. 如何拿下头条号原创标?这里有份6000字的指南
  15. linux注销系统有几种方法,怎么注销Linux子系统
  16. 可视化之circular barplot
  17. 【接口篇 / Lan】(5.6) ❀ 05. 与思科交换机三层链路聚合连接 ❀ FortiGate 防火墙
  18. C++:链表(初识链表)
  19. windows 10 移动热点无互联网连接
  20. ws2812驱动总结(包括对时序的详细分析,代码基于STC15系列单片机)

热门文章

  1. maven配置连接MySQL数据库2021最新版
  2. 开启kafka密码认证
  3. 下拉框练习,使用onchange事件
  4. 关于百度api地图中中文乱码的处理
  5. pdf文件被加密怎么解开,pdf不能复制打印、pdf忘记密码怎么办?
  6. Android Studio 运行项目报错:org.objectweb.asm.tree.analysis.AnalyzerException: Execution can fall off
  7. 历史回顾:全球股灾大放送
  8. 回顾2021,瞻望2022.
  9. 招银网络科技秋招补录前端面经
  10. 全球顶尖的程序化交易模型研究汇总