【问题标题】:event based openssl bio基于事件的openssl bio
【发布时间】:2021-02-03 04:31:06
【问题描述】:

我在https://gist.github.com/darrenjs/4645f115d10aa4b5cebf57483ec82eca 找到了使用 openssl BIO 实现“非阻塞”套接字 IO 的示例代码。

但在 main 函数中 poll 只监听标准输入和套接字 fd。 poll 从不听 rbio 和 wbio。

这是否意味着函数 BIO_writeBIO_read 正在阻塞?如果他们阻塞它会使代码阻塞正确吗?如果他们没有阻止,为什么poll 函数不听BIOs?

我尝试使用BIO_get_fd 函数,但它总是返回 0。我认为它不应该默认创建 fd。我尝试使用 *bio = BIO_new(BIO_s_fd()) 初始化 BIO,但 BIO_get_fd 仍然返回 0。

我创建了两个管道 int pipes[2][2] 使用函数 BIO_set_fd 并将管道[0][1] 给 rbio 并将管道[1][1] 给 wbio。 BIO_write 以这种方式工作。但是SSL_read 函数失败并出现错误SSL_ERROR_SYSCALL 我认为这意味着SSL_read 试图读取管道[0][1]。我知道管道是一种使用方式; pipe[0] 将用于读取 pipe[1] 将用于写入。但是我没有找到将 pipe[0] pipe[1] 设置为相同 BIO 的方法。

是否可以实现到 openssl BIO 的管道?

如果不可能,我怎么能说 openssl 来创建他们的 BIO fd,以便我可以在 poll/epoll/etc 中使用该 fd?

注意;我的主要目标是在 SSL/BIO 函数中不使用套接字 fd 的情况下进行基于事件的 BIO。我将处理 socket fd 和 BIO fd 之间的数据传输。

【问题讨论】:

    标签: c openssl


    【解决方案1】:

    poll 只需要监听stdinsocket.fd,因为这是rbio 从那里获取数据以及wbio 写入的地方。

    BIO_writeBIO_read 与它们的底层介质一样阻塞。在网络的情况下,它们可以被视为阻塞。但在您的示例中,它们都是BIO_s_mem,纯内存基 BIO-s。因此,您可以认为它们是非阻塞的。

    跳过,可以在几乎任何东西上创建 BIO。如果您有文件描述符 (FD),则无需执行任何操作,只需使用 BIO_s_fd。如果由于某种原因你不喜欢它,你总是可以实现你自己的 BIO。这并不难,而且有几个例子。

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多