решение
let fut = async move {
let mut stream = acceptor.accept(stream).await?;
let mut buf = [0; 1024];
let n = stream.read(&mut buf).await?;
println!("{}", from_utf8(&buf[..n]).unwrap());
let (tcp, _) = stream.get_ref();
tokio::select! {
_ = sleep(Duration::from_secs(1)) => {
println!("sleep finish");
stream
.write_all(
&b"HTTP/1.0 200 ok\r\n\
Connection: close\r\n\
\r\n\
hello world\n"[..],
)
.await?;
stream.flush().await?;
stream
.shutdown()
.await
.map_err(|e| anyhow!("shutdown {e:?}"))?;
}
_ = async {
loop {
match tcp.ready(Interest::READABLE).await {
Ok(r) => if r.is_read_closed() {
break
},
Err(e) => {
println!("{e}")
break;
}
}
sleep(Duration::from_millis(50)).await;
}
} => {
println!("closed");
}
}
Ok(()) as anyhow::Result<()>
};
А peek не подойдёт? Пару байтиков взять, чтобы убедиться в целостности коннекта
Вроде работает. Этот вариант мне больше нравится
Обсуждают сегодня