我在https://gist.github.com/darrenjs/4645f115d10aa4b5cebf57483ec82eca上找到了使用openssl BIO实现“非阻塞”套接字IO的示例代码。
但是在主函数中,poll只监听stdin和套接字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。
我使用BIO_set_fd函数创建了两个管道int pipes[2][2],并将管道提供给rbio,将pipes1提供给wbio。BIO_write就是这样工作的。但是SSL_read函数失败,并返回错误SSL_ERROR_SYSCALL,我认为这意味着SSL_read试图读取管道。我知道管道作为一种方式使用,就像;管道将用于读取,pipe1将用于写入。但我找不到方法将管道pipe1设置为相同的BIO。
可以实现到openssl BIOs的管道吗?
如果不可能,我怎么能说openssl来创建他们的BIO fd,这样我就可以在轮询/epoll/等中使用fd了?
注意:我的主要目标是在SSL/BIO函数中不使用套接字fd的情况下进行基于事件的BIO。我将处理套接字fd和BIO fd之间的数据传输。
发布于 2020-11-15 23:07:58
poll只需要监听stdin和socket.fd,因为这是rbio获取数据的地方,也是wbio写入的地方。
BIO_write和BIO_read就像它们的底层媒介一样阻塞。在网络情况下,它们可以被认为是阻塞的。但在您的示例中,它们都是BIO_s_mem,纯基于内存的BIO。因此,您可以认为它们是非阻塞的。
跳过这一步,几乎可以在任何东西上创建个人简介。如果你有一个文件描述符(FD),那么你不需要做任何事情,只需要使用BIO_s_fd。如果由于某些原因你不喜欢它,你可以随时实现你自己的简历。这并不太难,有几个例子。
https://stackoverflow.com/questions/64443580
复制相似问题