您的位置:首页 > 运维架构

openssl之BIO系列之3---BIO的声明和释放等基本操作

2014-10-22 10:08 288 查看
BIO的声明和释放等基本操作

在BIO的基本操作系列函数中,他们用来BIO分配和释放操作,包括:

BIO_new, BIO_set, BIO_free, BIO_vfree, BIO_free_all

他们的声明在openssl/bio.h文件中,其声明形式如下:

BIO * BIO_new(BIO_METHOD *type);

int BIO_set(BIO *a,BIO_METHOD *type);

int BIO_free(BIO *a);

void BIO_vfree(BIO *a);

void BIO_free_all(BIO *a);

下面分别对这些函数进行解释.

【BIO_new】

这个函数创建并返回一个相应的新的BIO,并根据给定的BIO_METHOD类型调用下述的BIO_set()函数给BIO结构的method成员赋值,如果创建或给method赋值失败,则返回NULL。创建一个Memory类型的BIO例子如下:

BIO* mem=BIO_new(BIO_s_mem());

有些类型的BIO使用BIO_new()函数之后就可以直接使用了,如memory类型的BIO;而有些BIO创建之后还需要一些初始化工作,如文件BIO,一般来说,也提供了这样的一些函数来创建和初始化这种类型的BIO。

这是什么意思呢,举个简单的例子大家就明白了:

比如创建一个文件BIO,使用下面的代码:

BIO* in=NULL;

in=BIO_new(BIO_s_file());

BIO_read_filename(in,"rsa512.pem");

这样,BIO in才能使用,而如果是创建一个memory类型的BIO,则只需要如下一句代码:

BIO* mem=BIO_new(BIO_s_mem());

然后就可以对该BIO mem进行操作了。

另外,需要补充的是(这个大家从前面两篇文章可能已经认识到了),对于source/sink类型的BIO,其类型创建函数一般为BIO_s_*的形式,对于filter型的函数,其类型创建函数一般为BIO_f_*的形式。

【BIO_set】

该函数功能比较简单,就是对一个已经存在的BIO设置新的BIO_METHOD类型。其实就是简单的对BIO的各个成员进行初始化,并将参数type赋值给该BIO。其实,BIO_new函数在使用OPENSSL_malloc给BIO分配了内存之后,就简单调用了BIO_set函数进行初始化工作。所以一般来说,除非你要重新设置你已经存在的BIO,否则是不需要直接调用这个函数的。成功操作返回1,否则返回0。

【BIO_free】

该函数释放单个BIO的内存和资源,成功操作返回1,失败返回0。BIO的操作不仅仅是释放BIO结构所占用的资源,也会释放其下层的I/O资源,比如关闭释放相关的文件符等,这对不同类型的BIO是不一样的,详细的请参看各种类型BIO本身的说明文件和源文件。需要注意的是,BIO_free只释放当前的一个BIO,如果用来释放一个BIO链,就可能会导致内存泄漏,这种情况应该使用下述的BIO_free_all函数。

【BIO_vfree】

该函数功能与BIO_free完全相同,只是没有返回值。事实上,它简单调用了BIO_free函数,但不返回该函数的返回值,所以它的函数实现代码只有一个语句。

【BIO_free_all】

该函数释放这个BIO链,并且即使在这个过程中,如果释放其中一个BIO出错,释放过程也不会停止,会继续释放下面的BIO,这保证了尽量避免内存泄漏的出现。如果你非要调用这个函数释放单个的BIO,那么效果跟BIO_free是一样的。事实上,该函数只是简单的遍历整个BIO链,并调用BIO_free释放各个环节的BIO。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: