diff options
Diffstat (limited to 'src/client.rs')
-rw-r--r-- | src/client.rs | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/src/client.rs b/src/client.rs index 56db92a..29244d0 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,16 +1,19 @@ use super::*; use async_trait::async_trait; use std::{io, sync::Arc}; -use tokio::net; +use tokio::{ + net, + sync::{mpsc, watch}, +}; #[derive(Debug)] -pub struct ToSrv(Arc<net::UdpSocket>); +pub struct UdpCltSender(Arc<net::UdpSocket>); #[derive(Debug)] -pub struct FromSrv(Arc<net::UdpSocket>); +pub struct UdpCltReceiver(Arc<net::UdpSocket>); #[async_trait] -impl UdpSender for ToSrv { +impl UdpSender for UdpCltSender { async fn send(&self, data: &[u8]) -> io::Result<()> { self.0.send(data).await?; Ok(()) @@ -18,7 +21,7 @@ impl UdpSender for ToSrv { } #[async_trait] -impl UdpReceiver for FromSrv { +impl UdpReceiver for UdpCltReceiver { async fn recv(&mut self) -> io::Result<Vec<u8>> { let mut buffer = Vec::new(); buffer.resize(UDP_PKT_SIZE, 0); @@ -30,21 +33,35 @@ impl UdpReceiver for FromSrv { } } -pub struct RemoteSrv; -impl UdpPeer for RemoteSrv { - type Sender = ToSrv; - type Receiver = FromSrv; +#[derive(Debug)] +pub struct CltReceiver(mpsc::UnboundedReceiver<Result<Pkt<'static>, Error>>); + +impl CltReceiver { + pub async fn recv_rudp(&mut self) -> Option<Result<Pkt<'static>, Error>> { + self.0.recv().await + } } -pub async fn connect(addr: &str) -> io::Result<(RudpSender<RemoteSrv>, RudpReceiver<RemoteSrv>)> { +pub type CltSender = Arc<Sender<UdpCltSender>>; +pub type CltWorker = Worker<UdpCltSender, UdpCltReceiver>; + +pub async fn connect(addr: &str) -> io::Result<(CltSender, CltReceiver, CltWorker)> { let sock = Arc::new(net::UdpSocket::bind("0.0.0.0:0").await?); sock.connect(addr).await?; - new( + let (close_tx, close_rx) = watch::channel(false); + let (pkt_tx, pkt_rx) = mpsc::unbounded_channel(); + + let sender = Sender::new( + UdpCltSender(Arc::clone(&sock)), + close_tx, PeerID::Srv as u16, PeerID::Nil as u16, - ToSrv(Arc::clone(&sock)), - FromSrv(sock), - ) - .await + ); + + Ok(( + Arc::clone(&sender), + CltReceiver(pkt_rx), + Worker::new(UdpCltReceiver(sock), close_rx, sender, pkt_tx), + )) } |