2012-06-09 29 views
1

我有一個緩衝SSL連接的BIO對象。我如何輪詢連接以查看是否可以不阻塞地調用讀取?如何輪詢SSL BIO對象?

OpenSSL的網站上說:有時與阻止套接字使用

的一種技術是使用一個系統調用(比如select(),輪詢()或等同物),以確定在數據可用時,然後調用讀取()來讀取數據。不應使用與BIO等價的(即在基礎I/O結構上調用select(),然後調用BIO_read()來讀取數據),因爲對BIO_read()的單個調用可能導致多次讀取(並寫入底層I/O結構上的SSL BIO),並可能因此而阻塞。相反,select()(或等效)應該與非阻塞I/O結合使用,以便連續讀取請求重試而不是阻塞。

這裏的問題是,因爲它是在其他地方做我不能改變的連接類型。有另一種方法來實現我的目標嗎?

回答

0

您可以使用fcntl(2)F_SETFL來設置文件描述符上的O_NONBLOCK標誌。由於當你想設置這個標誌時,套接字正在通過OpenSSL的BIO實用程序使用,所以應該沒問題 - 應用程序的其餘部分在通過BIO例程之前無法使用套接字中的數據。

因此我相信你可以改變連接類型。

我在bio.h頭看到一個爲你的情況做了一個API:

#define BIO_set_nbio(b,n)  BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) 

雖然有手冊中的以下警告:

BIO_set_nbio() sets the non blocking I/O flag to n. If n is 
    zero then blocking I/O is set. If n is 1 then non blocking 
    I/O is set. Blocking I/O is the default. The call to 
    BIO_set_nbio() should be made before the connection is 
    established because non blocking I/O is set during the 
    connect process. 

也許根本BIO接口ISN」一旦連接完成,預計會改變;這將是值得嘗試這明確fcntl(2)自稱 - 也許它會一切正常。

+0

即時通訊在Windows上,關於不指定。但是,我嘗試了'fcntl'的windows變體:'ioctlsocket'和'OpenSSL'只是崩潰。 – chacham15