openssl之BIO系列之5---CallBack函数及其控制
CallBack函数及其控制
---依据openssl doc/crypto/bio/bio_set_callback.pod翻译和自己的理解写成
(作者:DragonKing Mail:wzhah@263.net 公布于:gdwzh.126.com openssl专业论坛)
通过前面的介绍大家已经知道,BIO的callback函数是很重要的,是实现BIO多态性的一个关键因素之中的一个,BIO提供的callback控制系列函数有五个。事实上都是一些宏定义,以下是它的声明和定义(openssl/bio.h):
#define BIO_set_callback(b,cb) ((b)->callback=(cb))
#define BIO_get_callback(b) ((b)->callback)
#define BIO_set_callback_arg(b,arg) ((b)->cb_arg=(char *)(arg))
#define BIO_get_callback_arg(b) ((b)->cb_arg)
当中,callback函数本身的声明例如以下:
typedef long callback(BIO *b, int oper, const char *argp,
int argi, long argl, long retvalue);
此外,另一个用于调试目的的函数,事实上声明例如以下:
long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi,long argl,long ret);
假设要看详细的样例。那么在文件crypto/bio/bio_cb.c的函数BIO_debug_callback() 本身就是一个很好的样例。
以下。我们从callback函数本身開始分别简介这些函数的作用。
【callback】
callback函数在BIO中很重要。很多控制功能都是要通过callbank函数协助完毕的,比方BIO要运行释放的操作BIO_free,那么事实上它是先调用callback函数设置以下的操作将是释放操作(控制码:BIO_CB_FREE),然后才调用别的相关函数运行真正的操作。在后面我们会列出这些控制功能函数,并简单说明callback函数是怎么在这些功能的实现中使用的。如今,我先简介callback函数的各个參数:
(參数名字參看说明的函数的声明)
參数---b
这是callback函数的输入參数。也就是callback函数相应的BIO
參数---oper
设置BIO将要运行的操作,有些操作,callback函数将被调用两次,一次实在实际操作之前,一次实在实际操作之后。在后面的调用的时候。通常是将oper和BIO_CB_RETURN相或操作后作为參数的。
也就是说,后一次调用的时候oper參数应该使用oper|BIO_CB_RETURN。
參数---argp, argi,argl
这些參数依据oper定义的操作的不同而不一样,是在对应操作中要用到的參数。
參数---retvalue
这是默认的callback函数返回值。也就睡说,假设没有提供BIO没有提供对应的callback函数。那么就会返回这个值。真正的返回值是callback函数本身提供的。假设在实际的操作之前调用callback函数,而且这时候retvalue參数设置为1,假设callback的函数返回值无效。那么对callback函数的调用就会导致程序立马返回,BIO的操作就不会运行。
普通情况下。callback函数在运行完后都应该返回retvalue的值。除非该操作有特别的目的要改动这个返回值。
以下简单列出我们比較熟悉的一些跟callback函数相关的BIO函数使用callback函数的情况:
1.BIO_free(b)
在运行该操作之前,调用了callback(b, BIO_CB_FREE, NULL, 0L, 0L, 1L)
2.BIO_read(b,out,outl)
在运行该操作之前,调用了callback(b, BIO_CB_READ, out, outl, 0L, 1L),之后调用了callback(b, BIO_CB_READ|BIO_CB_RETURN, out, outl, 0L,retvalue)。大家能够看到,这就是我们上面说明过的情况,即两次调用callback的操作,后面一次oper的參数须要或上BIO_CB_RETURN。
3.BIO_write(b,in,inl)
在运行该操作之前,调用了callback(b, BIO_CB_WRITE, in, inl, 0L, 1L),之后调用了callback(b, BIO_CB_WRITE|BIO_CB_RETURN, in, inl, 0L, retvalue)
4.BIO_gets(b,out,outl)
在运行该操作之前,调用了callback(b, BIO_CB_GETS, out, outl, 0L, 1L),之后调用了callback(b, BIO_CB_GETS|BIO_CB_RETURN, out, outl, 0L, retvalue)
5.BIO_puts(b, in)
在运行该操作之前,调用了callback(b, BIO_CB_WRITE, in, 0, 0L, 1L) ,之后调用了callback(b, BIO_CB_WRITE|BIO_CB_RETURN, in, 0, 0L,retvalue)
6.BIO_ctrl(BIO *b, int cmd, long larg, void *parg)
在运行该操作之前,调用了callback(b,BIO_CB_CTRL,parg,cmd,larg,1L),之后调用了callback(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, larg,ret)
【BIO_set_callback和BIO_get_callback】
这两个函数用于设置和返回BIO中的callback函数,它们都是宏定义。依据前面的叙述我们已经知道。callback函数在很多高层的操作中都使用了。由于它能用于调试跟踪的目的或更改BIO的操作。具有非常大的灵活性,所以这两个函数也就实用武之地了。
【BIO_set_callback_arg和IO_get_callback_arg】
顾名思义,这两个函数用了设置和得到callback函数中的參数。
【BIO_debug_callback】
这是一个标准的调试信息输出函数。它把相关BIO运行的全部操作信息都打印输出到制定的地方。假设callback參数没有指定输出这些信息的BIO口。那么就会默认使用stderr作为信息输出port。
假设有不论什么问题,请到http://gdwzh.126.com联系我。
openssl之BIO系列之5---CallBack函数及其控制的更多相关文章
- openssl之BIO系列之6---BIO的IO操作函数
BIO的IO操作函数 ---依据openssl doc/crypto/bio/bio_read.pod翻译和自己的理解写成 (作者:DragonKing Mail:wzhah ...
- openssl之BIO系列之18---接受(accept)类型BIO
接受(accept)类型BIO ---依据openssl doc\crypto\bio_s_accept.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...
- openssl之BIO系列之12---文件描写叙述符(fd)类型BIO
文件描写叙述符(fd)类型BIO ---依据openssl doc\crypto\bio_s_fd.pod翻译和自己的理解写成 (作者:DragonKing Mailwzhah@263.net 公布于 ...
- openssl之BIO系列之24---SSL类型的BIO
SSL类型的BIO ---依据openssl doc\crypto\bio_f_ssl.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net ,公布于:h ...
- openssl之BIO系列之25---结束语
(作者:DragonKing, Mail: wzhah@263.net ,公布于:http://openssl.126.com之ope nssl专业论坛) 经过半个月左右,最终将BIO的结构和各个分支 ...
- openssl之BIO系列之9---BIO对的创建和应用
BIO对的创建和应用 ---依据openssl doc/crypto/bio/bio_new_bio_pair.pod翻译和自己的理解写成 (作者:DragonKing Mail:wzhah@263. ...
- openssl之BIO系列之22---Cipher类型的BIO
Cipher类型BIO ---依据openssl doc\crypto\bio_f_cipher.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net , ...
- openssl之BIO系列之20---缓冲(buffer)类型BIO
缓冲(buffer)类型BIO ---依据openssl doc\crypto\bio_f_buffer.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...
- openssl之EVP系列之13---EVP_Open系列函数介绍
openssl之EVP系列之13---EVP_Open系列函数介绍 ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成 (作者:Dra ...
随机推荐
- Java:利用java Timer类实现定时执行任务的功能
一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...
- 17.1 Replication Configuration 复制:
17.1 Replication Configuration 复制: 17.1.1 How to Set Up Replication 17.1.2 Replication Formats 17.1. ...
- 算法练习之DP 求LCM (最长公共子序列)
1. 对于序列x[1,i]和y[1,j],推导递推公式1.a 假设当前元素同样,那么就将当前最大同样数+12.b 假设当前元素不同.那么就把当前最大同样数"传递"下去 因此递推公式 ...
- PHP - 代码分离
总代码: <?php /* * Version:1.0 * CreateTime:2015年11月11日 * Author:HF_Ultrastrong *///引入公共文件,在公共文件中创建, ...
- UML01-概述
1.UML中的泛化关系用什么符号表示? 2.UML的英文全称是什么? 3.UML图不包括流程图. 4.对一个重要的系统有时要用多个模型就才能充分描述.
- 基于 SSH 的工具叫 sshfs. sshfs 可以让你在本地直接挂载远程主机的文件系统
另外一个很赞的基于 SSH 的工具叫 sshfs. sshfs 可以让你在本地直接挂载远程主机的文件系统. $ sshfs -o idmap=user user@hostname:/home/user ...
- 为进度条增加“伪进度条”?(使用QEventLoop和QTimer)
在实际开发中,可能会遇到这样的场景:“一个操作非常耗时,但却无法获取其进度百分比”.造成这种情况的原因可能有: 1)该操作属于第三方库(泛指我们使用但无法修改的第三方代码,因此质量有高有底),可能由于 ...
- (step 8.2.8)hdu 1079(Calendar Game)
题目大意是: 两个家伙在区域赛前夕闲的无聊,然后玩一种无限纠结的游戏,随即给定一个日期,每次只能移动day OR month.......... 而且如果下一个月没有当前day的话, 你就不能移动mo ...
- zoj 1730 / poj 1455 Crazy Tea Party
这阵子都没怎么写代码,由于开学,忙于各种琐碎的事情,现在静下来了开始跟着暑假的节奏刷题了. 这道题一开是没看清题目-在寝室刷题就是效率不高... 后来才知道,题目意思是,一个环形序列,1minute可 ...
- 双绞线的制作,T568A线序,T568B线序
双绞线的制作 1.1 实验目的 双绞线是组建局域网时常常使用的通信传输介质,通过本实验,让学生学会制作双绞线. 1.2 实验任务 (1)了解双绞线的特性及屏蔽与非屏蔽双绞线的区别. (2)了解EIA/ ...