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


    缓冲(buffer)类型BIO

        ---依据openssl doccryptoio_f_buffer.pod翻译和自己的理解写成

        (作者:DragonKing, Mail: wzhah@263.net ,公布于:http://gdwzh.126.com之o

    penssl专业论坛)

        缓冲(buffer)类型BIO是一种过滤(filter)型的BIO,其相关的一些函数定义如

    下(opensslio.h):

         BIO_METHOD * BIO_f_buffer(void);

         #define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES

    ,0,NULL)

         #define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_

    SIZE,size,0)

         #define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF

    _SIZE,size,1)

         #define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size

    ,NULL)

         #define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_R

    EAD_DATA,num,buf)

        【BIO_f_buffer】

        该函数返回一个Buffer类型的BIO_METHOD结构。该结构定义例如以下(bf_buff.c):

        static BIO_METHOD methods_buffer=

         {

         BIO_TYPE_BUFFER,

         "buffer",

         buffer_write,

         buffer_read,

         buffer_puts,

         buffer_gets,

         buffer_ctrl,

         buffer_new,

         buffer_free,

         buffer_callback_ctrl,

         };

        由结构定义可见,该类型BIO支持全部BIO的I/O函数。

    写入缓冲(buffer)BIO的数据

    存储在缓冲区里面,定期写入到BIO链的下一个BIO中,其实,仅仅有缓冲区已满或者调

    用了BIO_flush函数时。数据才会写入以下的BIO,所以。当不论什么存储在缓冲区的数据需

    要写入的时候(如在使用BIO_pop函数从BIO链中删除一个buffer类型BIO之前),必须使

    用BIO_flush函数,假设BIO链的末尾是一个非堵塞型的BIO。有时候调用BIO_flush可能

    出现失败,须要重试的情况。

    从该类型BIO读取数据时。数据从下一个BIO填充到该BIO的

    内部缓冲区中,然后再读出来。

    该类型BIO支持BIO_gets和BIO_puts方法,其实,BIO

    _gets函数是通过在下一个BIO的BIO_read函数来实现的,所以,假设一个BIO不支持BIO

    _gets方法(如SSL类型的BIO),能够通过预先附加一个buffer类型BIO来实现BIO_gets

    的功能。

        BIO_reset被调用的时候,该类型BIO里面的全部数据都会被清空。

        【BIO_get_buffer_num_lines】

        返回缓冲区中眼下数据的的行数。

        【 BIO_set_read_buffer_size、BIO_set_write_buffer_size和 BIO_set_buffer_

    size】

        这三个函数分别设置缓冲类型BIO的读、写或者读写缓冲区的大小。初始的缓冲区大

    小由宏定义DEFAULT_BUFFER_SIZE决定,默认的是1024。

    假设设置的缓冲区大小小于DEF

    AULT_BUFFER_SIZE。那么就会被忽略,也就是说缓冲区大小会保持为DEFAULT_BUFFER_S

    IZE所定义的大小。当又一次设置缓冲区大小时,里面的数据会所有被清空。成功运行返回

    1。否则返回0。

        【BIO_set_buffer_read_data】

        该函数清空缓冲区原有的数据,并使用num个buf中的数据填充该缓冲区,假设num的

    大小大于眼下的缓冲区设定大小。那么缓冲区就会自己主动扩大。成功设置返回1,否则返回

    0。

  • 相关阅读:
    VC++实现感染文件式加载DLL文件
    vC++实现遍历桌面和快速启动里的所有快捷方式,判断快捷方式是不是浏览器,如果是则删除快捷方式参数
    VC++另类实现进程插入
    云服务系列:Windows Azure SDK for .NET(2012 年 6 月发布的版本)的最新消息
    VC++1.5K字节实现下载并远程注入
    上海求职指南 (最新版)
    WinAPI: GetWindowText 获取窗口标题
    WinAPI: SetCursorPos 设置鼠标指针位置
    WinAPI: SetComputerName 更改计算机名称
    GDI+ 学习记录(31): 图像颜色变换(TGPImageAttributes)
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6790046.html
Copyright © 2020-2023  润新知