use std::{ net::{ Ipv4Addr, SocketAddr, SocketAddrV4, }, sync::Arc, }; use tokio::{ net::{ TcpSocket, UdpSocket, }, spawn, }; use crate::loops; pub async fn main () -> anyhow::Result <()> { let udp_sock = UdpSocket::bind (SocketAddrV4::new (Ipv4Addr::UNSPECIFIED, crate::PORT_1)).await?; udp_sock.connect ((Ipv4Addr::LOCALHOST, crate::PORT_0)).await?; let tcp_sock = TcpSocket::new_v4 ()?; let tcp_conn = tcp_sock.connect (SocketAddr::V4 (SocketAddrV4::new (Ipv4Addr::LOCALHOST, crate::PORT_2))).await?; let (tcp_read, tcp_write) = tcp_conn.into_split (); let tx_task; let rx_task; { let udp_sock = Arc::new (udp_sock); rx_task = spawn (loops::rx (Arc::clone (&udp_sock), tcp_read)); tx_task = spawn (loops::tx (Arc::clone (&udp_sock), tcp_write)); } tokio::select! { _val = tx_task => { println! ("client_main: tx_task exited, exiting"); } _val = rx_task => { println! ("client_main: rx_task exited, exiting"); } } Ok (()) }