libcurl简单介绍和使用
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类型的指针.
1. CURLOPT_URL
2. CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA
3. CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA
4. CURLOPT_READFUNCTION CURLOPT_READDATA
5. CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA
6. CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:
CURLOPT_TIMEOUT 由于设置传输时间,CURLOPT_CONNECTIONTIMEOUT 设置连接等待时间
7. CURLOPT_FOLLOWLOCATION
3.准备libcurl库
先将下载得到的libcurl库拿到Linux系统下,拖拽或FileZilla
1.处理libcurl库
tar xvf curl-7.71.1.tar.bz2
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
./configure -help
make
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/"
vi /tmp/get.html
可打开获取的百度网页,当然无界面的,全是代码形式,和我们查看网页的代码的内容是一样的
#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简单介绍和使用相关推荐
- libcurl 基础介绍
一.LibCurl基本编程框架 libcurl 是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcur ...
- 遗传算法的简单介绍以及模式定理的简单证明
遗传算法 遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...
- 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...
- 2021年大数据ELK(十五):Elasticsearch SQL简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...
- 2021年大数据ELK(二):Elasticsearch简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
- 简单介绍一下R中的几种统计分布及常用模型
统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...
- LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍
LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...
- dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
最新文章
- pcre安装_Nginx学习_第一期_安装及安装问题解决
- 华为交换机ssh思科交换机_使用SSH或Telnet访问思科业务交换机CLI
- solr从数据库为solr_home导入数据
- 回顾 | Kubernetes SIG-Cloud-Provider-Alibaba 首次网研会(含 PPT 下载)
- python图片解析库_python用来获得图片exif信息的库实例分析
- linux 远程链接数据库报错host *** is not allowed to connect to this mysql server
- typedef struct 和 struct 的区别
- 【Ubuntu】Ubuntu16.04安装火狐浏览器中国版
- 《操作系统原理》课程中涉及的数据结构总结
- 易绍坤网络赚钱:淘宝客获取佣金网赚之路,该如何进行?
- cwRsync文件同步
- 基于STM32F103的消防系统之火焰传感器
- 债券收益率建模(时间序列建模)时间序列相似度度量
- 如何拿下头条号原创标?这里有份6000字的指南
- linux注销系统有几种方法,怎么注销Linux子系统
- 可视化之circular barplot
- 【接口篇 / Lan】(5.6) ❀ 05. 与思科交换机三层链路聚合连接 ❀ FortiGate 防火墙
- C++:链表(初识链表)
- windows 10 移动热点无互联网连接
- ws2812驱动总结(包括对时序的详细分析,代码基于STC15系列单片机)
热门文章
- maven配置连接MySQL数据库2021最新版
- 开启kafka密码认证
- 下拉框练习,使用onchange事件
- 关于百度api地图中中文乱码的处理
- pdf文件被加密怎么解开,pdf不能复制打印、pdf忘记密码怎么办?
- Android Studio 运行项目报错:org.objectweb.asm.tree.analysis.AnalyzerException: Execution can fall off
- 历史回顾:全球股灾大放送
- 回顾2021,瞻望2022.
- 招银网络科技秋招补录前端面经
- 全球顶尖的程序化交易模型研究汇总