如何从TcpListener窥探Tokio TcpStream?

问题描述

我正在使用rustls和hyper编写服务器,希望先窥视然后解析Tcpstream,然后接受我想要的相应tokio_rustls::TlsAcceptor。但是,这导致我在流上同时使用异步和非异步功能tokio::net::Tcpstream::peektokio_rustls::TlsAcceptor::accept),这给我带来了麻烦。简单地为peek函数添加一个异步块会给我带来"unused implementer of `core::future::future::Future` that must be used"错误,并且将move更改为async move无效。

我想知道是否有某种方法可以解决此问题,也许是通过不使用and_then()解决

// Dependencies: futures-util = "0.3.1",rustls = "0.18"
// tokio = {version = "0.2",features = ["full"]},tokio-rustls = "0.14.0"
use tokio::net::{TcpListener,Tcpstream};
use tokio_rustls::server::Tlsstream;
use tokio_rustls::TlsAcceptor;
use std::{sync,io};
use futures_util::{
    future::TryFutureExt,stream::{StreamExt,TryStreamExt},};

#[tokio::main]
async fn run_server() -> Result<(),Box<dyn std::error::Error + Send + Sync>>{
    let addr = format!("127.0.0.1:{}",8000);
    let mut tcp = TcpListener::bind(&addr).await?;

    let tls_config = sync::Arc::new(rustls::ServerConfig::new(rustls::NoClientAuth::new()));
    let tls_acceptor = TlsAcceptor::from(tls_config);

    let mut v = vec![0u8; 16 * 1024];

    // main focus of question
    let incoming_tls_stream = tcp
        .incoming()
        .map_err(|e| error(format!("Incoming Failed: {:?}",e)))
        .and_then(move |mut s: Tcpstream| {
            let n: usize = s.peek(&mut v).await.unwrap();
            println!("{:}",n);
            // parse something from stream
            let parsed = do_something(&v[..n]);
            println!("{:}",parsed);

            tls_acceptor.accept(s).map_err(|e| {
                println!("Client-connection error...");
                error(format!("TLS Error: {:?}",e))
            })
        })
        .Boxed();

    // ...
    return Ok(());
}

fn main() {
    if let Err(e) = run_server() {
        eprintln!("Failed: {}",e);
        std::process::exit(1);
    }
}

fn error(err: String) -> io::Error {
    io::Error::new(io::ErrorKind::Other,err)
}

fn do_something(bytes: &[u8]) -> &str {
    return "test";
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)