我使用Tokio创建普通的TCP套接字,调用tokio::io::split()
,并将读/写半部分交给单独的线程。他们使用带有await
的异步套接字读/写API来完成IO。我们的数据流在输入/输出方向上是相当隔离的,因此此模型在我们的情况下效果很好。到目前为止,一切都很好。
现在,我正在考虑在顶部添加TLS支持。某些TLS库出于各种原因不允许拆分流:
因此,同一线程需要执行读/写操作。这意味着套接字现在需要变为非阻塞状态:不能等待数据进入,因为可能需要立即发送数据(反之亦然)。
如果我理解正确,那么Tokio/
await
范例对于非阻塞套接字是没有意义的。我的理解正确吗?在这种情况下的任何其他想法也欢迎。我希望到目前为止,我们已经付出了所有的努力,我们不需要放弃Tokio。
最佳答案
的确,启用了异步/等待的TLS库(例如 tokio-tls
)要求未拆分提供的流,但是,一旦将流包装在TLS层中,就可以使用 tokio::io::split
拆分该包装的流。
以这种方式使用流可以正确处理有关阻塞和非阻塞IO的所有详细信息。您不需要手动配置诸如O_NONBLOCK
的标记,因为Tokio的 TcpStream
和tokio-tls
的 TlsStream
会在后台为您处理这些详细信息。
使用提供阻塞套接字的库自然与Tokio不兼容。这并不是什么新鲜事物,并且出于同样的原因,您不能在Tokio中使用 std::net::TcpStream
,因为它是阻塞流。为了避免这些问题,Tokio提供了备用的流类型。
如果要使用未启用异步/等待的ssl crate ,则可以在内存缓冲区中执行加密,并使用Tokio的TcpStream
手动写入加密数据。启用了async/await的ssl库均以这种方式起作用。
关于asynchronous - 由于无法在TLS连接中拆分流,我是否需要离开Tokio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61088639/