缓冲(buffer)类型BIO

缓冲(buffer)类型BIO

—根据openssldoc\crypto\bio_f_buffer.pod翻译和自己的理解写成

(作者:DragonKing,Mail:wzhah@263.net,发布于:之o

penssl专业论坛)

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

下(openssl\bio.h):

BIO_METHOD*BIO_f_buffer(void);

#defineBIO_get_buffer_num_lines(b)BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES

,0,NULL)

#defineBIO_set_read_buffer_size(b,size)BIO_int_ctrl(b,BIO_C_SET_BUFF_

SIZE,size,0)

#defineBIO_set_write_buffer_size(b,size)BIO_int_ctrl(b,BIO_C_SET_BUFF

_SIZE,size,1)

#defineBIO_set_buffer_size(b,size)BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size

,NULL)

#defineBIO_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):

staticBIO_METHODmethods_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。

既有美妙的风景,也会有称不上景、只有风的地方。

缓冲(buffer)类型BIO

相关文章:

你感兴趣的文章:

标签云: