1. 程式人生 > >openssl之BIO系列之6---BIO的IO操作函數

openssl之BIO系列之6---BIO的IO操作函數

長度 沒有 ons lin mail crypto 可能 說明文 作者

BIO的IO操作函數
---依據openssl doc/crypto/bio/bio_read.pod翻譯和自己的理解寫成

(作者:DragonKing Mail:[email protected] 公布於:http://gdwzh.126.com之openssl專業論壇)

這些函數是BIO的基本讀寫操作函數,包含四個,他們的定義例如以下(openssl/bio.h):
int BIO_read(BIO *b, void *buf, int len);
int BIO_gets(BIO *b,char *buf, int size);

int BIO_write(BIO *b, const void *buf, int len);
int BIO_puts(BIO *b,const char *buf);
【BIO_read】
從BIO接口中讀出指定數量字節len的數據並存儲到buf中。成功就返回真正讀出的數據的長度,失敗返回0或-1,假設該BIO沒有實現本函數則返回-2。
【BIO_gets】
該函數從BIO中讀取一行長度最大為size的數據。通常情況下,該函數會以最大長度限制讀取一行數據,可是也有例外,比方digest型的BIO,該函數會計算並返回整個digest信息。

此外,有些BIO可能不支持這個函數。成功就返回真正讀出的數據的長度,失敗返回0或-1。假設該BIO沒有實現本函數則返回-2。須要註意的時,假設對應的BIO不支持這個函數,那麽對該函數的調用可能導致BIO鏈自己主動添加一個buffer型的BIO。


【BIO_write】
往BIO中寫入長度為len的數據。成功就返回真正寫入的數據的長度。失敗返回0或-1,假設該BIO沒有實現本函數則返回-2。


【BIO_puts】
往BIO中寫入一個以NULL為結束符的字符串,成功就返回真正寫入的數據的長度,失敗返回0或-1,假設該BIO沒有實現本函數則返回-2。

須要註意的是。返回指為0或-1的時候並不一定就是發生了錯誤。在非堵塞型的source/sink型或其他一些特定類型的BIO中,這只代表眼下沒有數據能夠讀取。須要稍後再進行該操作。


有時候。你可能會使用了堵塞類型的sokect使用的一些系統調用技術(如select,poll,equivalent)來決定BIO中是否有有效的數據被read函數讀取,但建議不要在堵塞型的接口中使用這些技術。由於這種情況下假設調用BIO_read就會導致在底層的IO中多次調用read函數。從而導致port堵塞。建議select(或equivalent)應該和非堵塞型的IO一起使用,可以在失敗之後可以又一次讀取該IO,而不是堵塞住了。
關於BIO的IO操作為什麽會失敗以及怎麽處理這些情況請參加BIO_should_retry()函數的說明文檔。

openssl之BIO系列之6---BIO的IO操作函數