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函数及其控制的更多相关文章

  1. openssl之BIO系列之6---BIO的IO操作函数

    BIO的IO操作函数     ---依据openssl doc/crypto/bio/bio_read.pod翻译和自己的理解写成          (作者:DragonKing Mail:wzhah ...

  2. openssl之BIO系列之18---接受(accept)类型BIO

    接受(accept)类型BIO ---依据openssl doc\crypto\bio_s_accept.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...

  3. openssl之BIO系列之12---文件描写叙述符(fd)类型BIO

    文件描写叙述符(fd)类型BIO ---依据openssl doc\crypto\bio_s_fd.pod翻译和自己的理解写成 (作者:DragonKing Mailwzhah@263.net 公布于 ...

  4. openssl之BIO系列之24---SSL类型的BIO

    SSL类型的BIO ---依据openssl doc\crypto\bio_f_ssl.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net ,公布于:h ...

  5. openssl之BIO系列之25---结束语

    (作者:DragonKing, Mail: wzhah@263.net ,公布于:http://openssl.126.com之ope nssl专业论坛) 经过半个月左右,最终将BIO的结构和各个分支 ...

  6. openssl之BIO系列之9---BIO对的创建和应用

    BIO对的创建和应用 ---依据openssl doc/crypto/bio/bio_new_bio_pair.pod翻译和自己的理解写成 (作者:DragonKing Mail:wzhah@263. ...

  7. openssl之BIO系列之22---Cipher类型的BIO

    Cipher类型BIO ---依据openssl doc\crypto\bio_f_cipher.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.net , ...

  8. openssl之BIO系列之20---缓冲(buffer)类型BIO

    缓冲(buffer)类型BIO ---依据openssl doc\crypto\bio_f_buffer.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...

  9. openssl之EVP系列之13---EVP_Open系列函数介绍

    openssl之EVP系列之13---EVP_Open系列函数介绍     ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成     (作者:Dra ...

随机推荐

  1. AlphaMobileControls介绍

    大家在开发wince程序或者windows mobile程序时还在为丑陋的界面着急吗?AlphaMobileControls可以帮你解决这些方案.当然如果你是高手可以自己去实现一些特殊的功能,自己定义 ...

  2. c++11 新特性之 autokeyword

    C++11是对眼下C++语言的扩展和修正.C++11包含大量的新特性:包含lambda表达式,类型推导keywordauto.decltype,和模板的大量改进. g++编译c++11命令加上 -st ...

  3. PHP - 操作MySQL数据库

    第16章 PHP操作MySQL 学习要点: 1.PHP连接到MySQL 2.增删改查 3.其他常用函数 如果你已经具有了使用PHP.SQL和MySQL的丰富经验,现在就可以把所有这些技术组合在一起.P ...

  4. Java 自定义日志写入

    /** * 将信息写入到日志 * @param content * @return * @throws IOException */ public static boolean writeLog(St ...

  5. TPersistent的三个用途(读写DFM文件,Assign,RTTI),最主要还是第三个用途

    不是什么类对象都需要RTTI,如果把它放在TObject,除了增加可执行文件的大小以及运行内存空间以外,没什么好处.

  6. FMXUI - UI.Dialog 示例

    在 FMXUI 开源库,增加了 UI.Dialog 单元.此单元实现了跨平台的基础对话框组件.使用时引用 UI.Dialog 即可.如果需要自定义对话框的样式, 可以添加一个 TDialogStyle ...

  7. 浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥

    概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的.RSA就是取自他们三个人的名字. 算法基于一个数论:将两个大素数相乘很ea ...

  8. Expert for SQL Server 诊断系列

    Expert for SQL Server 诊断系列 Expert 诊断优化系列------------------锁是个大角色   前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库 ...

  9. Javascript做模糊查询

    <html> <head> <title>Javascript模糊查找</title> </head> <body> <l ...

  10. Swift - 使用atlas图集实现动画效果(SpriteKit游戏开发)

    我们通常继承SKSpriteNode来实现游戏中的元素,除了可以使用图片作为纹理皮肤外.我们还可以使用动画纹理集来实现动画播放. 动画纹理集的制作也很简单,首先要有一套动画序列图,然后把它们放到一个文 ...