[英]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_BUFFER
和SSL_MODE_ENABLE_PARTIAL_WRITE
以使其按我想要的方式工作。
如果你想閱讀代碼的 SSL 部分,它在這里:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.