Rust. Tokio. Почему функция прокси ждет, пока в оба сокета не придет сообщение и отрабатывает только после этого (такое частичное применение)?

Рейтинг: 0Ответов: 0Опубликовано: 22.05.2023
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));
        });
    }
}

Ответы

Ответов пока нет.