c - 基于事件的openssl bio

标签 c openssl

我在 https://gist.github.com/darrenjs/4645f115d10aa4b5cebf57483ec82eca 找到了示例代码使用 openssl BIO 实现“非阻塞”套接字 IO。
但是在主函数中 poll只监听 stdin 和 socket fd。民意调查从不听 rbio 和 wbio。
是不是表示函数BIO_writeBIO_read正在阻塞?如果他们正在阻塞它会使代码阻塞吗?如果他们没有阻止为什么poll函数不听 BIO ?
我尝试使用 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。我将处理套接字 fd 和 BIO fd 之间的数据传输。

最佳答案

poll只需要听stdinsocket.fd ,因为那是rbio从哪里获取数据 wbio写到。BIO_writeBIO_read就像他们的底层媒体一样阻塞。在网络的情况下,它们可以被视为阻塞。但是在您的示例中,它们都是 BIO_s_mem , 纯内存型 BIO-s。因此,您可以认为它们是非阻塞的。
跳过,它是 几乎可以在任何东西上创建 BIO。如果您有文件描述符 (FD),那么您无需执行任何操作,只需使用 BIO_s_fd .如果由于某种原因您不喜欢它,您可以随时实现自己的 BIO。这并不太难,有几个例子。

关于c - 基于事件的openssl bio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64443580/

相关文章:

java - SSL 错误 : error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number error when disabling ssl and enabling TLS

ssl - 如何在源代码中查找函数

c - 指向函数的指针,结构作为参数

c - 在 C 中使用 Pthread 库

c++ - (使用 'while' 的插入排序)和(使用 'for' 的插入排序)之间的计算时间有何不同?

mongodb - macOS 大苏尔 -> 11.1? dyld : Library not loaded:/usr/local/opt/openssl/lib/libssl. 1.0.0.dylib

ssl - 转换 SSL 证书

c - Linux线程优先级

c - sort 函数不会打印排序后的数组?

c++ - OpenSSL 错误 - ClamAV 在 Windows 10 上构建