libcurl网络协议库使用Demo

news2024/11/25 0:24:39

目录

1 libcurl简介

2 libcurl编译

3 使用步骤

4 函数说明

4.1 全局初始化函数 curl_global_init

4.2 全局释放函数 curl_global_cleanup

4.3 libcurl库版本 curl_version

 4.4 开启会话 curl_easy_init

4.5 结束会话 curl_easy_cleanup

4.6 设置传输选项 curl_easy_setopt

4.7 执行传输任务 curl_easy_perform

5 演示Demo

5.1 开发环境

5.2 示例代码

5.3 下载地址


1 libcurl简介

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

        官网:https://curl.haxx.se/

2 libcurl编译

        Windows平台libcurl库的下载地址:curl for Windows

注意:下载的Windows库,只包含头文件和dll库,缺少lib文件。

        可用VS编译器自带工具命令行根据def文件和dll文件生成lib文件

        以“管理员身份”运行cmd,进行VS的安装路径,把def文件和dll文件放到VC\bin目录下,然后执行:

lib /machine:x64 /def:libcurl-x64.def         //生产64位lib文件libcurl-x64.lib
lib /machine:x86 /def:libcurl.def             //生产32位lib文件libcurl.lib

3 使用步骤

  1. 调用curl_global_init()初始化libcurl
  2. 调用curl_easy_init()函数得到CURL指针
  3. 根据curl_easy_setopt()设置传输选项,设置回调函数以完成用户特定任务
  4. 调用curl_easy_perform()函数执行传输任务
  5. 调用curl_easy_cleanup()释放内存
  6. 调用curl_global_cleanup()析构libcurl

        在整个过程中设置curl_easy_setopt()参数是最关键的,几乎所有的libcurl程序都要使用它。

        在基于libcurl的程序里,主要采用callback function(回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。

4 函数说明

4.1 全局初始化函数 curl_global_init

/*
    功能:全局初始化
    参数:flags - [in]   CURL_GLOBAL_ALL       //初始化所有的可能的调用。
                        CURL_GLOBAL_SSL       //初始化支持 安全套接字层。
                        CURL_GLOBAL_WIN32     //初始化win32套接字库。
                        CURL_GLOBAL_NOTHING   //没有额外的初始化。
    返回:0-成功,其他-失败
*/
CURLcode curl_global_init(long flags);

        这个函数只能用一次。如果这个函数在curl_easy_init函数调用时还没调用,它将由libcurl库自动调用,所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。

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

4.2 全局释放函数 curl_global_cleanup

/*
    功能:全局释放
    参数:
    返回:
*/
void curl_global_cleanup(void);

         在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。

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

4.3 libcurl库版本 curl_version

 /*
    功能:libcurl库版本
    参数:
    返回:libcurl库版本
*/
char *curl_version(void);

 4.4 开启会话 curl_easy_init

 /*
    功能:初始化CURL指针
    参数:
    返回:CURL指针
*/
CURL *curl_easy_init(void);

        curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样),相应的在调用结束时要用curl_easy_cleanup函数清理。

        一般curl_easy_init意味着一个会话的开始。它会返回一个easy_handle(CURL*对象),一般都用在easy系列的函数中。

4.5 结束会话 curl_easy_cleanup

 /*
    功能:释放CURL指针
    参数:curl - [in] CURL指针
    返回:
*/
void curl_easy_cleanup(CURL *curl);

        这个调用用来结束一个会话,与curl_easy_init配合着用。

4.6 设置传输选项 curl_easy_setopt

 /*
    功能:设置传输选项
    参数:curl   - [in] CURL指针
         option - [in] 传输选项参数 
    返回:0-成功,其他-失败
*/
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);

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

4.7 执行传输任务 curl_easy_perform

 /*
    功能:执行传输任务
    参数:curl   - [in] CURL指针
    返回:0-成功,其他-失败
*/
CURLcode curl_easy_perform(CURL *curl);

5 演示Demo

5.1 开发环境

  • curl-8.4.0_6
  • Visual Studio 2015
  • Windows 10 Pro x64

5.2 示例代码

  1. 调用curl_global_init()初始化libcurl
  2. 调用curl_easy_init()函数得到CURL指针
  3. 根据curl_easy_setopt()设置传输选项,设置回调函数以完成用户特定任务
  4. 调用curl_easy_perform()函数执行传输任务
  5. 调用curl_easy_cleanup()释放内存
  6. 调用curl_global_cleanup()析构libcurl
int main()
{
        // 调用curl_version,获取版本信息
        printf("%s\n\n",curl_version());

        // 调用curl_global_init 全局初始化
        curl_global_init(CURL_GLOBAL_ALL);

        // 调用curl_easy_init()函数得到 easy interface型指针
        CURL* client = curl_easy_init();
        
        // 调用curl_easy_setopt()设置传输选项(通过调用curl_easy_setopt这个函数来对指针进行各种配置,比如:请求的方式)
        curl_easy_setopt(client, CURLOPT_URL, "http://www.baidu.com");
        
        // 调用curl_easy_perform()函数进行访问请求
        curl_easy_perform(client);

        // 调用curl_easy_cleanup()释放内存
        curl_easy_cleanup(client);

        // 调用curl_global_cleanup 全局释放
        curl_global_cleanup();

    return 0;
}

5.3 下载地址

        开发环境:

  • Windows 10 pro x64
  • Visual Studio 2015
  • curl-8.4.0_6

        下载地址: libcurl网络协议库使用Demo

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

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

相关文章

最新版快递小程序源码 独立版快递系统 附教程

懂得都懂,现在电商平台退换货量大,快递需求量大,对接物流一个单子4块到6块之间 其中间是例如润 其余的 就不说了吧 互站上买的源码 分享一下 还有个方法赚钱就是 拼多多退货自己邮寄 5块钱 运费自己填写12元 白捡7元美滋滋 源码下载&…

Vivado - JTAG to AXI Master (GPIO、HLS_IP、UART、IIC)

1. 简介 本文分享 JTAG to AXI Master IP Core 的使用教程。 此 IP 用于 AXI 接口向设计输入数据,或者读取数据。通过 Tcl 控制台编写命令来驱动此 IP,通过 JTAG 即可进行操作,而这个 IP 则在 AXI 端口上驱动 AXI 事务。由于这个核心没有自…

面试题之- null和undefined的区别

前言 首先undefined和null都是基本数据类型,这两个基本数据类型分别都只有一个值,就是undefined和null。 undefined代表的含义是未定义,null代表的的含义是空对象,一般变量声明了但是还有没有定义的时候会返回undefined&#xf…

每日学习一个数据结构-默克尔树(Merkle Tree)

文章目录 概述特征构建过程使用场景示例总结 设计目的一、提高数据验证效率二、增强数据安全性三、适用于分布式系统 底层原理一、数据块划分与哈希计算二、二叉树的构建三、默克尔树的应用与优势 更新机制 概述 默克尔树(Merkle Tree),也称…

cnn突破六(四层bpnet网络公式)

四层bpnet网络反向传播公式推导: X【196】-》HI【128】/HO【128】-》H2I【60】/H2O【60】-》YI【10】/YO【10】, 期望是d【10】 X,HI之间用w1【196,128】 HO,H2I之间用w12【128,60】 H2O,YI之间用w2【…

Zabbix 企业级应用(Zabbix Enterprise Application)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【AI学习】Mamba学习(三):离散化SSM的矩阵计算

SSM离散化表示 除了连续的输入之外,还会通常碰到离散的输入(如文本序列)。所以SSM需要离散化形式,就是下面公式2和3。 SSM离散化过程 但是好奇这个离散化过程是如何进行的? 《一文通透想颠覆Transformer的Mamba:从SSM、HiPPO、…

【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解

目录 1、NIO 2、NIO 和 IO 的区别 1. 阻塞 vs 非阻塞 2. 一个线程 vs 多个连接 3. 面向流 vs 面向缓冲 4. 多路复用 3、Channel & Buffer (1)Channel:双向通道 (2)Buffer:缓冲区 (3)ByteBuffer&#xff…

GO网络编程(五):海量用户通信系统3:整体框架与C/S通信总体流程【重要】

这个系统其实是尚硅谷的老韩讲的(尚硅谷网络编程项目),但是他讲得很碎片化,思路不够清晰,时间又长,所以要掌握还是挺难的。如果你听了他的视频,不去梳理系统业务流程,不去看代码就往…

云计算身份认证与访问控制(Cloud Computing Identity Authentication and Access Control)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

支持向量机(SVM)基础教程

一、引言 支持向量机(Support Vector Machine,简称SVM)是一种高效的监督学习算法,广泛应用 于分类和回归分析。SVM以其强大的泛化能力、简洁的数学形式和优秀的分类效果而备受机器学 习领域的青睐。 二、SVM基本原理 2.1 最大间…

watch命令:周期执行指定命令

一、命令简介 ​watch ​命令用于周期性地执行指定的命令,并显示其输出结果。 ‍ 二、命令参数 2.1 命令格式 watch [选项] 命令2.2 选项 ​-n, --interval​: 指定更新间隔时间(以秒为单位)。默认间隔时间为 2 秒。​-d, --difference…

数学与生活

多学科交叉 信号处理 小波 经济 政策 计算机 统计 信号处理与市场分析 经济与数据分析 政策与统计 过去的数学家没有一个是纯粹的数学家;生活中各方面工程的,物理的,天文,地理的,赌博,政治的&#xff1b…

删除AlibabaProtect

首先管理员运行cmd 然后执行下行 sc delete AlibabaProtect重启电脑,再删除该文件夹C:\Program Files (x86)\AlibabaProtect

prometheus学习笔记之PromQL

prometheus学习笔记之PromQL 一、PromQL语句简介 官方文档:https://prometheus.io/docs/prometheus/latest/querying/basics/ Prometheus提供⼀个函数式的表达式语⾔PromQL (Prometheus Query Language),可以使⽤户实时 地查找和聚合时间序列数据&…

vSAN04:vSAN远程数据存储挂载、双节点集群介绍/安装/组件读写/高级配置/故障处理方式

目录 vSAN远程数据存储挂载双节点vSAN集群介绍双节点vSAN集群安装双节点vSAN集群的组件读写方式双节点vSAN的高级配置双节点vSAN故障处理方式 vSAN远程数据存储挂载 在同一个vCenter下的VSAN集群可以互相挂载对方VSAN存储,以达到提高资源利用率的目的。 一个集群最…

Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)

文章目录 Docker的数据持久化是什么?1.数据卷(Data Volumes)使用Docker 创建数据卷创建数据卷创建一个容器,将数据卷挂载到容器中的 /data 目录。进入容器,查看数据卷内容停止并重新启动容器,数据卷中的数据…

打卡第四天 P1081 [NOIP2012 提高组] 开车旅行

今天是我打卡第四天,做个省选/NOI−题吧(#^.^#) 原题链接:[NOIP2012 提高组] 开车旅行 - 洛谷 题目描述 输入格式 输出格式 输入输出样例 输入 #1 4 2 3 1 4 3 4 1 3 2 3 3 3 4 3 输出 #1 1 1 1 2 0 0 0 0 0 输入 #2 10 4 5 6 1 …

k8s 中存储之 hostPath 卷

目录 1 hostPath 卷介绍 2 hostPath 卷实际应用操作 2.1 创建 pod 资源类型 2.2 修改清单文件增加 hostPath 对应的参数配置 2.3 查看是否创建 卷 和 pod 2.4 创建发布文件测试是否正常访问 1 hostPath 卷介绍 EmptyDir中数据不会被持久化,它会随着Pod的结束而销…

每日一题|2187. 完成旅途的最少时间|二分法、计数器

本题的一个思路是从小到大遍历全部可能的t,并分别计算当前每一辆车所能够行驶的最多trips数量。 但是如果从1开始,结束在最不理想的情况是max(time) * totalTrip,在数据很大的时候很容易time out。 所以不妨对每一个可能的t重新思考性质。随…