libcurl开源库的编译与使用全攻略

libcurl简介

  • libcurl 是一个广泛使用的、支持多种协议的、开源的客户端URL传输库,提供了许多用于数据传输的API,例如文件传输、FTP、HTTP、HTTPS、SMTP等。
  • libcurl 的主要特点包括
    • 支持多种协议:libcurl 支持多种协议,如 HTTP、FTP、SMTP 等,方便开发者在不同的场景下使用。
    • 易于使用:libcurl 的 API 设计简洁,易于使用,方便开发者快速开发出网络通信功能。
    • 可移植性强:libcurl 支持多种操作系统,如 Linux、Windows、MacOS 等,方便开发者在不同的平台上使用。
    • 可定制性强:libcurl 支持插件机制,开发者可以根据自己的需求定制不同的插件,实现不同的功能。
    • 高效稳定:libcurl 在数据传输过程中采用了多种优化技术,保证了数据传输的高效性和稳定性。
  • 总的来说,libcurl 是一个功能强大、易于使用、可移植性强、可定制性强、高效稳定的网络通信库,被广泛应用于各种软件开发中。
  • 本文章主要介绍libcurl在windows和linux平台下的编译步骤,并介绍了libcurl相关的API接口,最后通过一个demo演示如何通过libcurl发送http请求。

libcurl相关包下载

  • libcurl github路径
  • libcurl发行版本路径
    • linux平台下载tar.gz包。以7.85.0版本为例,下载curl-7.85.0.tar.gz 包。
    • windows平台下载zip包。 以7.85.0版本为例,下载curl-7.85.0.zip 包
  • openssl发行版本 :使用libcurl一般都需要依赖openssl库
    • openssl发行版本只有tar.gz包,windows/linux平台都使用这个包即可。以1.1.1u版本为例,下载 openssl-1.1.1u.tar.gz 包
  • perl下载 : windows平台安装openssl需要这个工具

linux平台libcurl库编译

  • 由于需要依赖openssl,先编译openssl库

  • openssl编译

    • 解压openssl压缩包后进入解压后的目录
    • 分别执行以下命令
    •   ./config --prefix=${PWD}/_installsudo makesudo make install
      
    • 编译安装完成后,openssl相关库和头文件都会释放到 _install 目录下
  • libcurl编译

    • 解压libcurl压缩包后进入解压后的目录
    • 分别执行以下命令
    •   ./configure --prefix=${PWD}/_install --with-openssl=${PWD}/../openssl-1.1.1u/_installsudo make sudo make install
      
    • –prefix 指定的是安装目录,如果不指定会默认安装到系统目录下。–with-openssl 指定的是openssl相关库目录。
    • 编译安装完成后,相关库和头文件会释放到_install目录下

windows平台libcurl库编译

  • 先安装perl,还需安装Visual Studio,建议使用 Visual Studio 2015
  • 解压libcurl后进入目录
  • 进入projects目录执行以下命令先编译openssl
    •   build-openssl.bat vc14 -VSpath "E:\Program Files (x86)\Microsoft Visual Studio 14.0" x86 release ../../openssl-1.1.1u
      
    • VSpath指定的是 Visual Studio 2015 安装目录,如果默认安装在C盘,可不指定。最后指定openssl包的目录
    • 编译完成后,会在openssl目录下的 Win32\VC14 下生成openssl相关头文件和目录
  • 进入libcurl目录下的 projects\Windows\VC14 目录,使用 Visual Studio 2015 打开 curl-all.sln
  • 解决方案将libcurl设为启动项目,这里选择编译32位,依赖openssl的Release版本库 在这里插入图片描述
  • 这里包含编译出来的openssl头文件目录
    在这里插入图片描述
  • 再链接编译出来的openssl动态库目录
    在这里插入图片描述
  • 保存编译后,在libcurl目录下的 build\Win32\VC14\DLL Release - DLL OpenSSL 目录下就会生成对应的libcurl静态库和动态库。
    在这里插入图片描述

相关接口

  • CURLcode curl_global_init(long flags)

    • 描述:初始化libcurl,只能调用一次,且在其他函数之前调用
    • 参数
      • flags
        • CURL_GLOBAL_ALL : 初始化所有的可能的调用。
        • CURL_GLOBAL_SSL : 初始化支持 安全套接字层。
        • CURL_GLOBAL_WIN32 : 初始化win32套接字库。
        • CURL_GLOBAL_NOTHING : 没有额外的初始化
    • 返回值 : 返回 CURLE_OK 为成功,返回其他值失败
  • CURL *curl_easy_init(void)

    • 描述:初始化一个CURL类型的指针,要在 curl_easy_cleanup 中进行释放。
    • 返回值: 返回一个 CURL 类型指针,在 curl_easy_setopt 函数中使用
  • CURLcode curl_easy_setopt(CURL *curl, CURLoption option, …);

    • 描述:设置选项
    • 参数
      • curl : curl_easy_init 返回的 CURL类型指针
      • option :curl_easy_setopt函数option参数介绍
    • 返回值 : 返回 CURLE_OK 为成功,返回其他值失败
  • CURLcode curl_easy_perform(CURL *curl)

    • 描述:以阻塞方式执行请求
    • 参数
      • curl :curl_easy_init 返回的 CURL类型指针
    • 返回值:返回 CURLE_OK 为成功,返回其他值失败
  • CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, …)

    • 描述:请求curl 会话中的相关信息
    • 参数
      • curl :curl_easy_init 返回的 CURL类型指针
      • info
        • CURLINFO_RESPONSE_CODE :获取http状态码
        • 其他参数描述
    • 返回值:返回 CURLE_OK 为成功,返回其他值失败
  • void curl_easy_reset(CURL *curl)

    • 描述:重新初始化CURL指针为默认值
  • void curl_easy_cleanup(CURL *curl)

    • 描述:清理 curl_easy_init 接口申请的 CURL 类型指针
  • curl_easy_setopt函数option参数介绍

    • CURLOPT_URL :设置要访问的URl
    • CURLOPT_WRITEFUNCTION :设置回调函数,回调函数在libcurl接收到数据后被调用
      • 回调函数原型:size_t function(void *ptr, size_t size, size_t nmemb, void *stream);
    • CURLOPT_WRITEDATA :用于表明 CURLOPT_WRITEFUNCTION 函数中的stream指针的来源
    • CURLOPT_HEADERFUNCTION :设置回调函数,回调函数在libcurl接收到http响应头后被调用
      • 回调函数原型 : size_t function( void *ptr, size_t size,size_t nmemb, void *stream);
    • CURLOPT_HEADERDATA : 表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。
    • CURLOPT_TIMEOUT :设置数据传输超时时间
    • CURLOPT_CONNECTIONTIMEOUT :设置连接超时时间
    • CURLOPT_POST :设置请求方式为post
    • CURLOPT_POSTFIELDS : 设置post请求体
    • CURLOPT_POSTFIELDSIZE :设置post请求大小
    • CURLOPT_HTTPHEADER : 设置http请求头
    • CURLOPT_SSL_VERIFYPEER :设置是否验证对端证书,设置为0表示不验证。默认为1,表示验证。
    • CURLOPT_SSL_VERIFYHOST :设置是都验证服务器证书,设置为0表示不验证。
    • 其他参数

演示代码

  • 本测试代码通过libcurl实现发送http请求
  •   #include <stdio.h>#include <stdlib.h>#include <string.h>#include <curl/curl.h>#include <iostream>typedef struct {std::string body;size_t bodySize;} stResponse;typedef struct {std::string header;size_t headerSize;} stResponseHeader;size_t responseBodyCallback(void *ptr, size_t size, size_t nmemb, void *stream) {stResponse* pResponse = (stResponse*)stream;pResponse->body.append((char*)ptr, size * nmemb);pResponse->bodySize = size * nmemb;return size * nmemb;}size_t responseHeaderCallback(void *ptr, size_t size, size_t nmemb, void *stream){stResponseHeader* pResponseHeader = (stResponseHeader*)stream;pResponseHeader->header.append((char*)ptr, size * nmemb);pResponseHeader->headerSize = size * nmemb;return size * nmemb;}int main(){std::string readBuffer;stResponse response;stResponseHeader responseHeader;// 初始化所有可能的调用curl_global_init(CURL_GLOBAL_ALL);CURL *curl = curl_easy_init();// 设置urlcurl_easy_setopt(curl, CURLOPT_URL, "http://182.92.205.179:10088");// 设置post请求,不设置或设置为0则为get请求curl_easy_setopt(curl, CURLOPT_POST, 1);// 设置post请求体char postData[1024] = "{\"req\":\"hello\"}";curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);// 设置post请求体大小curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(postData));// 设置http请求头curl_slist* headerList = NULL;headerList = curl_slist_append(headerList, "Content-Type: application/json");headerList = curl_slist_append(headerList, "flag: libcurl");curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerList);// 设置不校验证书,https请求时使用curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);// 设置回调函数获取响应体数据curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseBodyCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response);// 设置回调函数获取响应头数据curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeaderCallback);curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&responseHeader);// 超时时间curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);// 执行请求CURLcode res = curl_easy_perform(curl);// 检查错误if(res == CURLE_OK){// 获取状态码int responseCode = 0;curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);std::cout << "code : "<<responseCode << std::endl;std::cout << "responseHeader size : "<<responseHeader.headerSize << std::endl;std::cout << "responseHeader header : "<<responseHeader.header.c_str() << std::endl;std::cout << "response size : "<<response.bodySize << std::endl;std::cout << "response body : "<<response.body.c_str() << std::endl;}else{std::cout<<curl_easy_strerror(res)<<std::endl;}curl_slist_free_all(headerList);// 清理curl_easy_cleanup(curl);return 0;}
    
  • 完整工程已上传至gitee 测试工程

参考

  • 官方API文档

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

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

相关文章

Spring集成

目录 概述1 声朋一个简单的集成流1.1 使用XML定义集成流1.2 使用Java配置集成流1.3 使用Spring lntegration 的 DSL 配置 2 Spring integration 功能概览2.1 消息通道2.2 过滤器2.3 转换器2.4 路由器2.5 切分器2.6 服务激活器2.7 网关2.8 通道适配器2.9 端点模块 概述 就像我们…

JDK8-JDK17版本升级

局部变量类型推断 switch表达式 文本块 Records 记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类&#xff0c;但代码少得多&#xff1b;大多数开发人员使用 Lombok 生成 POJO 类&#xff0c;但是有了记录&#xff0c;你就不需要使…

逸学Docker【java工程师基础】3.1安装Jenkins

1.下载镜像 docker pull jenkins/jenkins:lts 2.运行容器 docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins:lts 3.要启动名为 jenkins 的 Docker 容器 docker st…

HarmonyOS-LocalStorage:页面级UI状态存储

管理应用拥有的状态概述 上一个章节中介绍的装饰器仅能在页面内&#xff0c;即一个组件树上共享状态变量。如果开发者要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。ArkTS根据不同特性&#xff0c;提供了多种应用状态…

OpenGauss源码分析-SQL引擎

所讨论文件大多位于src\common\backend\parser文件夹下 总流程 start_xact_command()&#xff1a;开始一个事务。pg_parse_query()&#xff1a;对查询语句进行词法和语法分析&#xff0c;生成一个或者多个初始的语法分析树。进入foreach (parsetree_item, parsetree_list)循环…

LeetCode 每日一题 Day 37-43

终于考完试了&#xff0c;寒假期间将会每天持续更新&#xff01; 447. 回旋镖的数量(Day 37) 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧…

通过开源端点可见性改善网络安全响应

在当今复杂的数字环境中&#xff0c;企业内的许多不同端点&#xff08;从数据中心的服务器到咖啡店的笔记本电脑&#xff09;创建了巨大且多样化的攻击面。每个设备都存在网络安全威胁的机会&#xff0c;每个设备都有其独特的特征和复杂性。攻击者使用的多种攻击媒介不仅是一个…

正则表达式中的“回引用(回溯)”——别名引用与序号引用的差异及正则表达式中的“P”关键字

读到一段巧妙的正则表达式&#xff0c;勾起我对正则表达式欠缺知识点的探寻&#xff1a; P y t h o n Python Python正则表达式中的“回引用(回溯)”——分组别名引用与序号引用的差异及正则表达式中的“P”关键字详情。 (笔记模板由python脚本于2024年01月14日 07:49:35创建&a…

pytorch集智4-情绪分类器

1 目标 从中文文本中识别出句子里的情绪。和上一章节单车预测回归问题相比&#xff0c;这个问题是分类问题&#xff0c;不是回归问题 2 神经网络分类器 2.1 如何用神经网络分类 第二章节用torch.nn.Sequantial做的回归预测器&#xff0c;输出神经元只有一个。分类器和其区别…

QT——connect的第五个参数 Qt::ConnectionType (及qt和c++的多线程的区别)

一直对QT的多线程和c的多线程的区别有疑惑&#xff0c;直到看到文档中这一部分内容才豁然开朗 一.ConnectionType参数的类型和区别 首先是官方文档中对于该枚举值的区别介绍&#xff1a; 对于队列&#xff08;queued &#xff09;连接&#xff0c;参数必须是 Qt 元对象系统已知…

强化学习应用(四):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

助力工业园区作业违规行为检测预警,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建工业园区场景下作业人员违规行为检测识别系统

在很多工业园区生产作业场景下保障合规合法进行作业生产操作&#xff0c;对于保护工人生命安全降低安全隐患有着非常重要的作用&#xff0c;但是往往在实际的作业生产中&#xff0c;因为一个安全观念的淡薄或者是粗心大意&#xff0c;对于纪律约束等意思薄弱&#xff0c;导致在…

maven镜像源设置aliyun提升下载速度

一、打开pom.xml project下在添加 <repositories><repository><id>aliyunmaven</id><name>aliyun</name><url>https://maven.aliyun.com/repository/public</url></repository><repository><id>central2&l…

分布形态的度量_峰度系数的探讨

集中趋势和离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点&#xff0c;还应掌握数据分布的形态。 描述数据分布形态的度量有偏度系数和峰度系数, 其中偏度系数描述数据的对称性,峰度系数描述与正态分布的偏离程度。 峰度系数反映分布峰的尖峭程度的重要指标. 当…

【ESP32接入语言大模型之智谱清言】

1. 智谱清言 讲解视频&#xff1a; 随着人工智能技术的不断发展&#xff0c;自然语言处理领域也得到了广泛的关注和应用。智谱清言作为千亿参数对话模型 基于ChatGLM2模型开发&#xff0c;支持多轮对话&#xff0c;具备内容创作、信息归纳总结等能力。可以快速注册体验中国版…

远程开发之vscode端口转发

远程开发之vscode端口转发 涉及的软件forwarded port 通过端口转发&#xff0c;实现在本地电脑上访问远程服务器上的内网的服务。 涉及的软件 vscode、ssh forwarded port 在ports界面中的port字段&#xff0c;填需要转发的IP:PORT&#xff0c;即可转发远程服务器中的内网端…

增强FAQ搜索引擎:发挥Elasticsearch中KNN的威力

英文原文地址&#xff1a;https://medium.com/nerd-for-tech/enhancing-faq-search-engines-harnessing-the-power-of-knn-in-elasticsearch-76076f670580 增强FAQ搜索引擎&#xff1a;发挥Elasticsearch中KNN的威力 2023 年 10 月 21 日 在一个快速准确的信息检索至关重要的…

基于MOD02/MYD02获得亮度温度再转冰温

用HEG处理MOD02/MYD02,提取里面的EV_1KM_Emissive波段,band为11和12(其实就是band 31和32)。注意这里的band和output dile type 1. 获得之后,转辐射亮度。 参考:https://www.cnblogs.com/enviidl/p/16539422.html radiance_scales,和radiance_offset这两项参数代表波段…

【生存技能】git操作

先下载git https://git-scm.com/downloads 我这里是win64&#xff0c;下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init&#xff0c;初始化当前目录成为git仓库…

LeetCode讲解篇之216. 组合总和 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 使用递归回溯算法&#xff0c;当选择数字num后&#xff0c;在去选择大于num的合法数字&#xff0c;计算过程中的数字和&#xff0c;直到选择了k次&#xff0c;如果数组和等于n则加入结果集 从1开始选择数字&#xff0c;直…