openssl编程-基础知识-回调函数

参考内容

  • OpenSSL编程 赵春平

回调函数

  • 回调函数就是一个通过函数指针调用的函数。
  • 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数
  • 把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。如果代码立即被执行就称为同步回调,如果在之后晚点的某个时间再执行,则称之为异步回调
  • C 语言回调函数详解 | 菜鸟教程
#include<stdio.h>int Callback_1() // Callback Function 1
{printf("Hello, this is Callback_1 \n");return 0;
}int Callback_2() // Callback Function 2
{printf("Hello, this is Callback_2 \n");return 0;
}int Callback_3() // Callback Function 3
{printf("Hello, this is Callback_3 \n");return 0;
}int Handle(int (*Callback)()) //函数指针
{printf("Entering Handle Function. \n");Callback();printf("Leaving Handle Function. \n");
}int main()
{printf("Entering Main Function. \n");Handle(Callback_1);Handle(Callback_2);Handle(Callback_3);printf("Leaving Main Function. \n");return 0;
}
/tmp/tmp.BI8jCkdUAx/cmake-build-debug/openssl-demo
Entering Main Function. 
Entering Handle Function. 
Hello, this is Callback_1 
Leaving Handle Function. 
Entering Handle Function. 
Hello, this is Callback_2 
Leaving Handle Function. 
Entering Handle Function. 
Hello, this is Callback_3 
Leaving Handle Function. 
Leaving Main Function. 进程已结束,退出代码0

例子

  • Openssl 中大量用到了回调函数。回调函数一般定义在数据结构中,是一个函数指针。 通过回调函数,客户可以自行编写函数,让 openssl 函数来调用它,即用户调用 openssl 提供 的函数,openssl 函数再回调用户提供的函数。这样方便了用户对 openssl函数操作的控制。 在 openssl 实现函数中,它一般会实现一个默认的函数来进行处理,如果用户不设置回调函数,则采用它默认的函数。
  • 本例子用来生产简单的随机数,如果用户提供了生成随机数回调函数,则生成随机数采用用户的方法,否则采用默认的方法

openssl-test.h

#ifndef OPENSSL_DEMO_OPENSSL_TEST_H
#define OPENSSL_DEMO_OPENSSL_TEST_H
typedef int *callback_random(char* random,int len);
void set_callback(callback_random *cb);
int generate_random(char* random,int len);
#endif //OPENSSL_DEMO_OPENSSL_TEST_H

openssl-test.cpp

#include "openssl-test.h"
#include <cstdio>
#include <cstring>callback_random *cb_rand = nullptr;static int default_random(char* random,int len){memset(random,0x01,len);
}void set_callback(callback_random *cb){cb_rand = cb;
}int generate_random(char* random,int len){if (cb_rand == nullptr){return default_random(random,len);} else{return *cb_rand(random,len);}
}

main.cpp

#include <cstring>
#include <cstdio>
#include "openssl-test.h"static int * my_rand(char* rand, int len){memset(rand,0x02,len);
}
int main()
{char random[10];int ret = 0;/** 如果注释掉 set_callback ,打印输出的数据均为 1,即没有使用自定义的函数进行回调* 如果用户自定义随机数函数,就会使用用户自定义的函数,而不是默认的函数*/
//    set_callback(my_rand);ret = generate_random(random,10);for (int i = 0; i < 10; ++i) {printf("%d ",random[i]);}return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)project(openssl-demo)
set(CMAKE_CXX_STANDARD 11)# 忽略警告
set(CMAKE_CXX_FLAGS "-Wno-error=deprecated-declarations -Wno-deprecated-declarations ")# 指定lib目录
link_directories(/usr/local/gmssl/lib)# 指定头文件搜索策略
include_directories(/usr/local/gmssl/include)# 使用指定的源文件来生成目标可执行文件
add_executable(${PROJECT_NAME} main.cpp openssl-test.h openssl-test.cpp)# 将库链接到项目中
target_link_libraries(${PROJECT_NAME} ssl crypto pthread dl)
  • 本实验使用远程服务器作为开发的配置环境

执行结果

 

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

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

相关文章

hive插件 ranger_Apache Ranger及Hive权限控制

一、Ranger概述1.Ranger简介Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。本文章介绍Ranger与Hive集成…

openssl编程-基础知识-OpenSSL简介

参考链接 在ubuntu环境下执行openssl编译和安装_MY CUP OF TEA的博客-CSDN博客_openssl ubuntuOpenSSL编程 赵春平 OpenSSL 简介 它提供的主要功能有&#xff1a;SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编…

linux修改文件句柄数生效_linux系统层面调优和常见的面试题

linux系统层面调优和常见的面试题​mp.weixin.qq.com无论对Spark集群&#xff0c;还是Hadoop集群等大数据相关的集群进行调优&#xff0c;对linux系统层面的调优都是必不可少的&#xff0c;这里主要介绍3种常用的调优&#xff1a;1.linux文件句柄linux在整个系统层面和单个进程…

openssl编程-基础知识-OpenSSL堆栈

堆栈介绍 堆栈是一种先进后出的数据结构openssl 大量采用堆栈来存放数据。它实现了一 个通用的堆栈&#xff0c;可以方便的存储任意数据它实现了许多基本的堆栈操作&#xff0c;主要有&#xff1a;堆栈拷贝(sk_dup)、构建新堆栈&#xff08;sk_new_null&#xff0c;sk_new&…

小米用户画像_企鹅智库:高学历用苹果中老年用华为 男性用小米女性用OV

不同手机品牌都有着自己不同的定位人群&#xff0c;在国内市场目前几大非常有名的手机品牌分别被三星、苹果、华为、小米、OV占据&#xff0c;而这些手机品牌的主要购买人群到底是什么样的呢&#xff1f;企鹅智库近日发布了一份手机消费者的调研报告&#xff0c;并且根据消费者…

国密gmtls协议-双证书体系的服务端和客户端通信代码

内容介绍 国密的双证书体系&#xff0c;将证书按照使用目的的不同划分为加密证书和签名证书两种&#xff0c;也就是两对公私钥&#xff0c;二者本质一致&#xff0c;均为SM2密钥对&#xff0c;区别仅体现在用法国密CA体系中&#xff0c;加密密钥对由CA产生&#xff0c;签名密钥…

jwt 私钥_什么是 JSON Web Token(JWT)

有关本文档的快速链接&#xff0c;请参考页面提示。什么是 JSON Web Token(JWT)?JSON Web Token (JWT) 作为一个开放的标准 (RFC 7519) 定义了一种简洁自包含的方法用于通信双方之间以 JSON 对象的形式安全的传递信息。因为有数字签名&#xff0c;所以这些通信的信息能够被校验…

server和client之间进行Socket通信,进行数据切片

参考链接 send函数和recv函数 – gudakos memo 注意事项 代码很low&#xff0c;主要看封装的Send函数所体现的切片思想即可 server代码 //udp服务端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include …

天线下倾角示意图_常用天线和无源器件技术参数汇总

原标题&#xff1a;常用天线和无源器件技术参数汇总一、天线原理天线的定义&#xff1a; 能够有效地向空间某特定方向辐射电磁波或能够有效的接收空间某特定方向来的电磁波的装置。天线的功能&#xff1a; 能量转换-导行波和自由空间波的转换; 定向辐射(接收)-具有一定的方向性…

制作作品图片_不懂人文后期制作流程?来,大师手把手教你

制作前1、处理一张照片思路决定步骤 想要了解学习的老师可以私聊小编fzhdyx222制作后2、2020年最新Camera Raw局部影调和色调的控制想要了解学习的老师可以私聊小编fzhdyx222制作前3、2020年最新Camera Raw基础工具细节性运用想要了解学习的老师可以私聊小编fzhdyx222制作后4、…

xlsx文件打开乱码_Excel 2016 双击无法打开xlsx文件怎么办?

最近我重装了系统(Win10Office2016)&#xff0c;然后发现了一个奇怪的bug&#xff1a;双击xlsx文件&#xff0c;只能打开Excel窗口&#xff0c;但是打不开这个文件&#xff0c;有时候再次双击就能打开了&#xff0c;但有时再次双击也不管用&#xff0c;需要在Excel的菜单中点“…

gmssl使用双证书双向认证的gmtl协议报错crypto/sm2/sm2_sign.c 510: sm2_do_verifySSL3 alert write:fatal:decrypt error

报错内容 crypto/sm2/sm2_sign.c 510: sm2_do_verify SSL3 alert write:fatal:decrypt error SSL_accept:error in error ERROR 140655864152064:error:1417B07B:SSL routines:tls_process_cert_verify:bad signature:ssl/statem/statem_srvr.c:2941: 相关内容 版本&#xf…

纠偏的意思_承压能力和纠偏能力,决定成长的高度

承压能力&#xff0c;包含抗压能力、抵御能力&#xff0c;担当能力&#xff0c;分解能力&#xff0c;消化能力&#xff0c;释放能力&#xff0c;等一系列的精神要素&#xff0c;是一个人生存生活工作中一项重要的素质。有的人&#xff0c;承压能力很强&#xff0c;无论经受什么…

《Java8实战》笔记(15):面向对象和函数式编程的混合-Java 8和Scala的比较

面向对象和函数式编程的混合&#xff1a;Java 8和Scala的比较 Scala是一种混合了面向对象和函数式编程的语言。它常常被看作Java的一种替代语言&#xff0c;程序员们希望在运行于JVM上的静态类型语言中使用函数式特性&#xff0c;同时又期望保持Java体验的一致性。和Java比较起…

函数指针作为形参进行调用

代码 两个代码均位于namespace作用域之内addOne将传递进来的形参进行加一&#xff0c;然后返回performance_test函数主要是想简化函数调用&#xff0c;两个形参&#xff0c;第一个表示循环的次数&#xff0c;第二个是带参数的函数指针&#xff0c;函数内部初始化start和end两个…

python中fetchall_Python连接MySQL并使用fetchall()方法过滤特殊字符

来一个简单的例子&#xff0c;看Python如何操作数据库&#xff0c;相比Java的JDBC来说&#xff0c;确实非常简单&#xff0c;省去了很多复杂的重复工作&#xff0c;只关心数据的获取与操作。准备工作需要有相应的环境和模块&#xff1a;Ubuntu 14.04 64bitPython 2.7.6MySQLdb注…

《Java8实战》笔记(16):结论以及Java的未来

结论以及Java的未来 回顾Java8的语言特性 行为参数化&#xff08;Lambda以及方法引用&#xff09; 流 CompletableFuture Optional 默认方法 Java的未来 集合 类型系统的改进 声明位置变量 更多的类型推断 模式匹配 更加丰富的泛型形式 具化泛型 泛型中特别为函…

解决吉大正源(身份认证网关|USBKey)和gmssl(server|client)使用gmtl协议交叉互通报错tlsv1 alert decrypt error

报错内容 SSL_connect:error in SSLv3/TLS write finished140057291788288:error:1409441B:SSL routines:ssl3_read_bytes:tlsv1 alert decrypt error:ssl/record/rec_layer_s3.c:1385:SSL alert number 51 报错原因 gmssl库生成 certificate verify 消息时&#xff0c;对自客…

12无法使用otg_12个冷知识:或许只能看看而无法使用,但却真实存在着

12个或许只能看看而无法使用&#xff0c;但却真实存在着。脸红一所有已知动物中&#xff0c;唯一可以脸红的是人类。二有些地区将雨水归类为公共财物&#xff0c;作为公共财物是不允许收集的&#xff0c;违反者将面临处罚。三世界上汽车研发成本最高的一款车是福特蒙迪欧&#…

《Java8实战》笔记汇总

《Java8实战》笔记&#xff08;01&#xff09;&#xff1a;为什么要关心Java8 《Java8实战》笔记&#xff08;02&#xff09;&#xff1a;通过行为参数传递代码 《Java8实战》笔记&#xff08;03&#xff09;&#xff1a;Lambda表达式 《Java8实战》笔记&#xff08;04&…