gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:12:03 28 4
gpt4 key购买 nike

我有一个多线程应用程序,它大量使用 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 成为非阻塞的,但文档中说:

The call to BIO_set_nbio() should be made before the connection is established because non blocking I/O is set during the connect process.

我考虑过的另一个可能的选择是复制 BIO 并重新创建它,同时以某种方式维护所有状态。

最佳答案

我在自己的“lion”代码中实现了非阻塞 SSL 连接,但我根本没有使用 OpenSSL 中的 BIO 功能。

相反,我去打电话了SSL_set_fd(ctx, fd )SSL_get_fd(ssl) 来处理我自己的 fdset 并调用 select

我花了一些时间才找到的最大“陷阱”是设置 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFERSSL_MODE_ENABLE_PARTIAL_WRITE 以使其按照我想要的方式工作。

如果你想阅读代码的 SSL 部分,它在这里:

https://github.com/lundman/lion/blob/master/src/tls.c

关于将 OpenSSL BIO 从阻塞模式更改为非阻塞模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8411168/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com