博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openssl之BIO系列之5---CallBack函数及其控制
阅读量:6578 次
发布时间:2019-06-24

本文共 2877 字,大约阅读时间需要 9 分钟。

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联系我。

转载地址:http://xoyno.baihongyu.com/

你可能感兴趣的文章
PHP多进程编程(2):管道通信
查看>>
【HTML5】Canvas和SVG的区别
查看>>
李洪强经典面试题8
查看>>
wireshark怎么抓包、wireshark抓包详细图文教程
查看>>
mysql 源码调试方法
查看>>
Asp.Net微信登录-手机网站APP应用
查看>>
用git管理自己读的书
查看>>
JS 数字转换为大写金额
查看>>
EASYUI 表单(FORM)用法
查看>>
[唐诗]187春思-李白
查看>>
SQL语言 之 事务控制
查看>>
详解C中的volatile关键字【转】
查看>>
tableviewCell的xib中collectionView签协议
查看>>
java基础之导出(Excel)
查看>>
JavaScript之面向对象学习三原型语法升级
查看>>
最新AndroidSDK安装教程
查看>>
【USACO 1.4】Arithmetic Progressions
查看>>
Eclipse linux tools 插件
查看>>
可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入
查看>>
使用Redis来实现LBS的应用
查看>>