【问题标题】:Changing an OpenSSL BIO from blocking to non-blocking mode将 OpenSSL BIO 从阻塞模式更改为非阻塞模式
【发布时间】: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不阻塞是一个的变化。

标签: c openssl


【解决方案1】:

我在自己的“狮子”代码中进行了非阻塞 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

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多