openssl之BIO系列之13---Socket類型BIO,openssl13---socket
Socket類型BIO
---根據openssl doc\crypto\bio_s_socket.pod翻譯和自己的理解寫成
(作者:DragonKing Mailwzhah@263.net 發佈於:httpgdwzh.126.com之openssl專
業論壇)
Socket類型的BIO也是一種source/sink型BIO,封裝了Socket的IO操作,它相關的一
些函數定義如下(openssl\bio.h):
BIO_METHOD * BIO_s_socket(void);
#define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd)
#define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c)
BIO *BIO_new_socket(int sock, int close_flag);
前面我們在介紹fd類型BIO的時候曾經說過,它的函數的實現檔案跟Soket類型的BI
O其實是放在一起的,都在檔案bss_socket.c裡面,從這些定義我們就可以知道,之所以
這樣做,是因為這兩種類型的BIO實現的函數基本是相同的,並且具有很多的共性。
【BIO_s_socket】
該函數返回一個Socket類型的BIO_METHOD結構,BIO_METHOD結構的定義如下:
static BIO_METHOD methods_sockp=
{
BIO_TYPE_SOCKET,
"socket",
sock_write,
sock_read,
sock_puts,
NULL, /* sock_gets, */
sock_ctrl,
sock_new,
sock_free,
NULL,
};
可以看到,它跟fd類型BIO在實現的動作上基本上是一樣的。只不過是首碼名和類型
欄位的名稱不一樣。其實在象Linux這樣的系統裡,Socket類型跟fd類型是一樣,他們是
可以通用的,但是,為什麼要分開來實現呢,那是因為有些系統如windows系統,socke
t跟檔案描述符是不一樣的,所以,為了平台的相容性,openssl就將這兩類分開來了。
BIO_read和BIO_write對底層的Socket結構進行讀寫操作。
BIO_puts是支援的,但是BIO_gets在Socket類型BIO中是不支援的,大家如果看源代
碼就可以知道,雖然BIO_gets在Socket類型是不支援的,但是如果調用該函數,不會出
現異常,只會返回-1的出錯資訊。
如果設定了關閉標誌,那麼當BIO被釋放的時候底層的Socket串連就會被關閉。
【BIO_set_fd】
該函數將Socket描述符fd設定為BIO的底層IO結構,同時可以設定關閉標誌c。該函
數返回1。
【BIO_get_fd】
該函數返回指定BIO的Socket描述符,如果c參數不是NULL,那麼就將該描述符存在
參數c裡面,當然,Socket描述符同時也作為返回值,如果BIO沒有初始化則調用失敗,
返回-1。
【BIO_new_socket】
該函數根據給定的參數返回一個socket類型的BIO,成功返回該BIO指標,失敗返回
NULL。其實,該函數依次調用了BIO_s_socket,BIO_new和BIO_set_fd實現它的功能。