我有一个多线程应用程序,该程序在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并重新创建它,同时以某种方式维护所有状态。
最佳答案
我在自己的“狮子”代码中进行了非阻塞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部分,则在这里:
https://github.com/lundman/lion/blob/master/src/tls.c
关于将OpenSSL BIO从阻止模式更改为非阻止模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8411168/