如何解决如何从TcpListener窥探Tokio TcpStream?
我正在使用rustls和hyper编写服务器,希望先窥视然后解析TcpStream,然后接受我想要的相应tokio_rustls::TlsAcceptor
。但是,这导致我在流上同时使用异步和非异步功能(tokio::net::TcpStream::peek
和tokio_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 举报,一经查实,本站将立刻删除。