Rust. Tokio. Почему функция прокси ждет, пока в оба сокета не придет сообщение и отрабатывает только после этого (такое частичное применение)?
use tokio::io::{AsyncRead, AsyncWrite, Result};
use tokio::net::TcpListener;
#[tokio::main]
async fn main() -> Result<()> {
let listener1: TcpListener = TcpListener::bind("127.0.0.1:8080").await?;
let listener2: TcpListener = TcpListener::bind("127.0.0.1:8081").await?;
loop {
let (stream1, _) = listener1.accept().await?;
let (stream2, _) = listener2.accept().await?;
tokio::spawn(async move {
let (mut s1_read, mut s1_write) = tokio::io::split(stream1);
let (mut s2_read, mut s2_write) = tokio::io::split(stream2);
tokio::try_join!(
async { tokio::io::copy(&mut s1_read, &mut s2_write).await },
async { tokio::io::copy(&mut s2_read, &mut s1_write).await }
)
.map(|(n1, n2)| {
println!("Forwarded {} bytes from stream1 to stream2", n1);
println!("Forwarded {} bytes from stream2 to stream1", n2);
})
.map_err(|err| {
eprintln!("Proxy error: {:?}", err);
err
})
.unwrap_or_else(|err| eprintln!("Error in proxy: {:?}", err));
});
}
}
Источник: Stack Overflow на русском