将OpenSSL BIO从阻塞模式更改为非阻塞模式

时间:2011-12-07 06:16:25

标签: c openssl

我有一个多线程的应用程序,它在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并重新创建它,同时以某种方式保持所有状态。

1 个答案:

答案 0 :(得分: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