【发布时间】:2012-01-14 17:16:05
【问题描述】:
我有一个多线程应用程序,它在 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 并重新创建它,同时以某种方式保持所有状态。
【问题讨论】:
-
我不明白您遇到的问题。在建立连接时设置非阻塞 IO 是合理的,当然您可以以一种处理它的方式抽象您的代码。
-
问题是在建立连接时使IO不阻塞是一个大的变化。