zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    rs
    stm32f767 usoc3
    stm32f767 RTT 日志
    stm32f767 标准库 工程模板
    stm32f767 HAL 工程模板
    docker tab 补全 linux tab 补全
    docker anconda 依赖 下载 不了
    docker run 常用 指令
    linux scp 命令
    Dockerfile 常用参数说明
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6790046.html
Copyright © 2011-2022 走看看