openssl之BIO系列之10---BIO鏈的定位操作

前面的一篇文章講過BIO鏈的構造方法,這裏講的是在一個BIO鏈中,怎麼查找一個特定的BIO,怎麼遍歷BIO鏈中的每一個BIO,這組函數定義如下(openssl/bio.h):
     BIO * BIO_find_type(BIO *b,int bio_type);
     BIO * BIO_next(BIO *b);
    
     #define BIO_method_type(b) ((b)->method->type)
    可以看到,這組函數中有兩個是真正的函數,另一個則是宏定義,其中,bio_type的值定義如下:
     #define BIO_TYPE_NONE 0
     #define BIO_TYPE_MEM (1|0x0400)
     #define BIO_TYPE_FILE (2|0x0400)
    
     #define BIO_TYPE_FD (4|0x0400|0x0100)
     #define BIO_TYPE_SOCKET (5|0x0400|0x0100)
     #define BIO_TYPE_NULL (6|0x0400)
     #define BIO_TYPE_SSL (7|0x0200)
     #define BIO_TYPE_MD (8|0x0200)
     #define BIO_TYPE_BUFFER (9|0x0200)
     #define BIO_TYPE_CIPHER (10|0x0200)
     #define BIO_TYPE_BASE64 (11|0x0200)
     #define BIO_TYPE_CONNECT (12|0x0400|0x0100)
     #define BIO_TYPE_ACCEPT (13|0x0400|0x0100)
     #define BIO_TYPE_PROXY_CLIENT (14|0x0200)
     #define BIO_TYPE_PROXY_SERVER (15|0x0200)
     #define BIO_TYPE_NBIO_TEST (16|0x0200)
     #define BIO_TYPE_NULL_FILTER (17|0x0200)
     #define BIO_TYPE_BER (18|0x0200)
     #define BIO_TYPE_BIO (19|0x0400)
    
     #define BIO_TYPE_DESCRIPTOR 0x0100
     #define BIO_TYPE_FILTER 0x0200
     #define BIO_TYPE_SOURCE_SINK 0x0400
    可以看到,這些定義大部分都是根據各種BIO類型來命名的,但並不是跟現有的BIO類型是一一對應的,在以後的文章裏,我會對這些BIO類型一一進行介紹,現在大家只要有一個概念就可以了。
    【BIO_find_type】
    該函數在給定的BIO鏈中根據特定的BIO類型bio_type進行搜索,搜索的起始位置就是b。如果給定的類型是一個特定的實現類型,那麼就會搜索一個給類型的BIO;如果只是一個總體的類型定義,如BIO_TYPE_SOURCE_SINK(就是sourc/sink類型的BIO),那麼屬於這種類型的最先找到的BIO就是符合條件的。在找到符合的BIO後,BIO_find_type返回該BIO,否則返回NULL。需要注意的是,如果你使用的0.9.5a以前版本,如果給輸入參數b賦值爲NULL,可能引起異常錯誤!
    【BIO_next】
    該函數顧名思義,是返回當前BIO所在的BIO鏈中的下一個BIO,所以,它可以用來遍歷整個BIO鏈,並且可以跟BIO_find_type函數結合起來,在整個BIO鏈中找出所有特定類型的BIO。這個函數是在0.9.6版本新加的,以前的版本要使用這個功能,只能使用bio->next_bio來定位了。
    【BIO_method_type】
    該函數返回給定的BIO的類型。
    下面給出一個在一個BIO鏈中找出所有digest類型BIO的例子:
     BIO *btmp;
     btmp = in_bio; /* in_bio 是被搜索的BIO鏈 */
    
     do {
     btmp = BIO_find_type(btmp, BIO_TYPE_MD);
     if(btmp == NULL) break; /* 如果沒有找到*/
     /* btmp 是一個digest類型的BIO,做些你需要做的處理 ...*/
     ...
    
     btmp = BIO_next(btmp);
     } while(btmp);
    

    到此爲止,就已經基本寫完了BIO的基礎知識方面的東西,下面的文章將開始對每一個具體的BIO類型進行介紹,我想有了前面的這些鋪墊和知識,後面的就輕鬆多了。


FW : http://blog.csdn.net/gdwzh/article/details/19207

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章