簡體   English   中英

將 OpenSSL BIO 從阻塞模式更改為非阻塞模式

[英]Changing an OpenSSL BIO from blocking to non-blocking mode

我有一個多線程應用程序,它在 C 中大量使用 OpenSSL。它的設計理念是它的所有 SSL 連接都應該被阻止。 具體來說,就是阻止 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);

但事實證明,在代碼庫的一些小部分中,使用非阻塞 BIO 將是最佳選擇。 受益於非阻塞 BIO 的小部分無法知道哪些 SSL 連接將屬於它們。 因此,它們總是接收阻塞 BIO。

問題是,阻塞的 BIO 可以改成非阻塞的嗎?

我知道BIO_set_nbio可用於使 BIO 非阻塞,但文檔說:

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

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

我在自己的“獅子”代碼中進行了非阻塞 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM