libcurl网络协议库使用Demo

目录

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.mfbz.cn/a/887873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(中篇)

本篇文章重点讲解参数最多的 关键帧 模块。 「动画模式」选择「3D」: 下方「运动」Tab 会有一系列参数: 以下4个参数,只有「动画模式」选择「2D」才会生效,可忽略: 运动 平移 X 让镜头左右移动: 大于0&a…

Seata学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

华为eNSP:端口隔离

一,什么是端口隔离 端口隔离是一种网络配置技术,用于将不同的网络设备或用户隔离在不同的虚拟局域网(VLAN)中,以实现网络流量的隔离和安全性提升。通过在交换机或路由器上配置端口隔离,可以将连接到同一设…

【机器学习-无监督学习】概率图模型

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

在VS code 中部署C#和avalonia开发环境

要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境,您可以按照以下步骤进行: 1. 安装 .NET SDK 下载 .NET SDK: 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK,并下载安装程序。安装 .NET SDK&#xff1…

VSCode | 设置Jupyter Notebook显示行号

vscode中的jupyter notebook每个cell都是默认不显示行号的,如果出现了报错,比如在52行出现报错,如果代码多的话不显示行号就有点麻烦,本文介绍如何设置显示行号。 1、VScode点击文件-首选项-设置 2、搜索“python”,点…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目! No.1 约数个数 No.2 约数之和 先来看第一道:约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

cherry-markdown开源markdown组件详细使用教程

文章目录 前言开发定位目标调研技术方案前提工作量安排数据库表设计实现步骤1、引入依赖2、实现cherry-markdown的vue组件(修改上传接口路径)3、支持draw.io组件4、支持展示悬浮目录toc前端使用:编辑状态使用cherry-markdown的vue组件前端使用…

netty之Netty心跳服务与断线重连

前言 使用netty中,需要监测服务是否稳定以及在网络异常链接断开时候可以自动重连。需要实现监听;f.addListener(new MyChannelFutureListener()) 代码目录结构 package com.lm.demo.netty.client;import io.netty.channel.ChannelFuture; import io.nett…

【11】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-模块化语法与自定义组件

序言: 本文详细讲解了关于鸿蒙系统学习中的模块化语法与自定义组件,在模块化语法中我们学习到了多种导入导出方式,实现了在一个项目中,通过引用不同的组件,让我们整体代码的可读性更强,相当于我们把一个手…

认知战认知作战:认知战与安全挑战中方企业在海外的应对策略分析

认知战认知作战:认知战与安全挑战中方企业在海外的应对策略分析 关键词:认知战, 中方企业, 恐怖袭击, 安全挑战, 信息传播, 社会责任, 风险管理, 国际合作,认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认知战争,认知战战术,认知战…

MATLAB中lsqminnorm函数用法

目录 语法 说明 示例 求解具有无限个解的线性系统 指定容差以减少含噪数据的影响 切换显示低秩矩阵警告 lsqminnorm函数的功能是线性方程的最小范数最小二乘解。 语法 X lsqminnorm(A,B) X lsqminnorm(A,B,tol) X lsqminnorm(___,rankWarn) 说明 X lsqminnorm(A,B…

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的,就需要了解Ansible的工作模,Ansible的工作模式有两种: push模式 push推送,这是Ansible的默认模式,在主控机上编排好playbook文件,push到远程主机上来执行。pull模式 p…

QT系统学习篇(2)- Qt跨平台GUI原理机制

一、Qt工程管理 1、新建项目: 我们程序员新建项目对话框所有5类项目模板 Application: Qt的应用程序,包含Qt Quick和普通窗口程序。 Library: 它可以创建动态库、静态库、Qt Creator自身插件、Qt Quick扩展插件。 其他项目: 创建单元测试项目、子目录项…

数据分析之Spark框架介绍

文章目录 概述一、发展历程与背景二、核心特点三、生态系统与组件四、应用场景五、与其他大数据技术的比较 核心概念1. 弹性分布式数据集(RDD, Resilient Distributed Dataset)2. 转换(Transformations)和动作(Actions…

Redis主从复制(replica)、哨兵

一、Redis主从复制介绍: 主从复制,master主机以写为主,slave从机以读为主,当主机数据变化的时候自动将新的数据异步同步到其他从机数据库;能够实现读写分离, 容灾恢复、 数据备份以及水平扩容支撑高并发 二、实现方法…

【stm32】ADC的介绍与使用

ADC的介绍与使用 1、ADC介绍2、逐次逼近型ADC3、ADC电路4、ADC基本结构程序代码编写:ADC 通道和引脚复用的关系 5、转换模式(1)单次转换,非扫描模式转换流程:程序编写: (2)连续转换&…

基于 springboot vue中学生日常行为评分管理系统设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

​通用代码生成器典型应用场景​

​通用代码生成器典型应用场景​ 1. 通用代码生成器简介 通用代码生成器或称动词算子式通用代码生成器,是一系列各种语言的易用的整站式代码生成器。其根本原理是把方法分解成动词算子和域对象的笛卡儿积。根据动词算子式代码生成器的基本原理。所有方法&#xff…

网 络 安 全

网络安全是指保护网络系统及其所存储或传输的数据免遭未经授权访问、使用、揭露、破坏、修改或破坏的实践和技术措施。网络安全涉及多个方面,包括但不限于以下几个方面: 1. 数据保护:确保数据在传输和存储过程中的完整性和保密性,…