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


BIO的IO操作函數
    ---依據openssl doc/crypto/bio/bio_read.pod翻譯和自己的理解寫成
    
    (作者:DragonKing Mail:wzhah@263.net 公布於: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()函數的說明文檔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM