2 use async_trait::async_trait;
3 use std::{io, sync::Arc};
10 pub struct UdpCltSender(Arc<net::UdpSocket>);
13 pub struct UdpCltReceiver(Arc<net::UdpSocket>);
16 impl UdpSender for UdpCltSender {
17 async fn send(&self, data: &[u8]) -> io::Result<()> {
18 self.0.send(data).await?;
24 impl UdpReceiver for UdpCltReceiver {
25 async fn recv(&mut self) -> io::Result<Vec<u8>> {
26 let mut buffer = Vec::new();
27 buffer.resize(UDP_PKT_SIZE, 0);
29 let len = self.0.recv(&mut buffer).await?;
37 pub struct CltReceiver(mpsc::UnboundedReceiver<Result<Pkt<'static>, Error>>);
40 pub async fn recv_rudp(&mut self) -> Option<Result<Pkt<'static>, Error>> {
45 pub type CltSender = Arc<Sender<UdpCltSender>>;
46 pub type CltWorker = Worker<UdpCltSender, UdpCltReceiver>;
48 pub async fn connect(addr: &str) -> io::Result<(CltSender, CltReceiver, CltWorker)> {
49 let sock = Arc::new(net::UdpSocket::bind("0.0.0.0:0").await?);
50 sock.connect(addr).await?;
52 let (close_tx, close_rx) = watch::channel(false);
53 let (pkt_tx, pkt_rx) = mpsc::unbounded_channel();
55 let sender = Sender::new(
56 UdpCltSender(Arc::clone(&sock)),
65 Worker::new(UdpCltReceiver(sock), close_rx, sender, pkt_tx),