【发布时间】:2021-02-03 04:31:06
【问题描述】:
我在https://gist.github.com/darrenjs/4645f115d10aa4b5cebf57483ec82eca 找到了使用 openssl BIO 实现“非阻塞”套接字 IO 的示例代码。
但在 main 函数中 poll 只监听标准输入和套接字 fd。 poll 从不听 rbio 和 wbio。
这是否意味着函数 BIO_write 和 BIO_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 之间的数据传输。
【问题讨论】: