2011-12-07 153 views
6

我有一個多線程應用程序,它在C中大量使用OpenSSL。它的設計思想是所有的SSL連接都會阻塞。具體來說,阻止BIO。他們都被分配掉了一個進入端口是這樣的:將OpenSSL BIO從阻塞模式更改爲非阻塞模式

ssl = SSL_new(ctx); 
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); 
sock = BIO_new_socket(socket, BIO_CLOSE); 
SSL_set_bio(ssl, sock, sock); 

事實證明,雖然,也有代碼庫的地方使用非阻塞的BIOS會是最好的選擇了幾個小零件。受益於非阻塞BIO的小部件無法知道哪些SSL連接屬於它們。因此,他們總是接收阻塞的BIO。

問題是,阻塞BIO可以更改爲非阻塞?

我知道BIO_set_nbio可以被用來製造生物無阻塞但文件說:

建立連接之前BIO_set_nbio()的調用應該進行,因爲非阻塞I/O是在連接過程中設置。

我想過的另一種可能的選擇是複製BIO並重新創建它,同時以某種方式保持所有狀態。

+0

我不明白你所遇到的問題。在建立連接時建立非阻塞IO是合理的,當然你可以用一種處理方式來抽象你的代碼。 –

+0

問題在於建立連接時使IO無阻塞是一個大變化。 – inthemedium

回答

5

我在自己的「獅子」代碼中做了非阻塞SSL連接,但我根本沒有在OpenSSL中使用BIO功能。

相反,我去電話 SSL_set_fd(ctx, fd)SSL_get_fd(ssl)來處理我自己的fdsets和呼籲select

花了一段時間追蹤的最大'陷阱'是設置SSL_MODE_ACCEPT_MOVING_WRITE_BUFFERSSL_MODE_ENABLE_PARTIAL_WRITE,因爲它按我想要的方式工作。

如果你想閱讀代碼的SSL部分,它是在這裏:

https://github.com/lundman/lion/blob/master/src/tls.c