使用Rust中的`tokio-rustls`从TlsStream<TcpStream>读取。

我使用的是 rustls,并想阅读 TlsStream 到缓冲区,同样,我们读取 TcpStream. 这是我正在做的。

let acceptor = TlsAcceptor::from(Arc::new(config));

let fut = async {

    let mut listener = TcpListener::bind(&addr).await?;

    loop {

        let (stream, peer_addr) = listener.accept().await?;
        let acceptor = acceptor.clone();

        let fut = async move {

            let mut stream = acceptor.accept(stream).await?;

            //// CURRENTLY THIS .read() is throwing error in compiler
            println!("Stream: {:?}", stream.read(&mut [0; 1024]));

            Ok(()) as io::Result<()>
        };

        handle.spawn(fut.unwrap_or_else(|err| eprintln!("{:?}", err)));
    }
};

它抛出错误

'error[E0599]: no method named `read` found for struct `tokio_rustls::server::TlsStream<tokio::net::tcp::stream::TcpStream>` in the current scope'

我希望从 TlsStream 产生的 tokio-rustls 到缓冲区。

解决方案:

正如你的错误信息所描述的那样,有一个特性 AsyncReadExt 但没有导入到 scope 中。为了能够使用 read 方法,你需要导入该特质;对于这个特质,通常是通过导入该特质的 东京序曲:

use tokio::prelude::*;

// or you can explicitly import just AsyncReadExt, but I'd recommend the above
use tokio::io::AsyncReadExt;

此外,你还需要特别 await 所得 read(),因为它返回的是一个未来。你还需要在一个单独的变量中使用缓冲区,因为那是存储读取数据的地方。

let mut buffer = [0; 1024];
let byte_count = stream.read(&mut buffer).await;
//                                       ^^^^^^
println!("Stream: {:?}", &buffer[0..byte_count]);

本文来自投稿,不代表运维实战侠立场,如若转载,请注明出处:https://www.shizhanxia.com/844.html

(0)
上一篇 2022年6月29日 下午4:01
下一篇 2022年6月29日 下午4:01

相关推荐

发表评论

登录后才能评论