]> git.lizzy.rs Git - mt_rudp.git/blob - src/client.rs
Don't spawn tasks
[mt_rudp.git] / src / client.rs
1 use super::*;
2 use async_trait::async_trait;
3 use std::{io, sync::Arc};
4 use tokio::net;
5
6 #[derive(Debug)]
7 pub struct ToSrv(Arc<net::UdpSocket>);
8
9 #[derive(Debug)]
10 pub struct FromSrv(Arc<net::UdpSocket>);
11
12 #[async_trait]
13 impl UdpSender for ToSrv {
14     async fn send(&self, data: &[u8]) -> io::Result<()> {
15         self.0.send(data).await?;
16         Ok(())
17     }
18 }
19
20 #[async_trait]
21 impl UdpReceiver for FromSrv {
22     async fn recv(&mut self) -> io::Result<Vec<u8>> {
23         let mut buffer = Vec::new();
24         buffer.resize(UDP_PKT_SIZE, 0);
25
26         let len = self.0.recv(&mut buffer).await?;
27         buffer.truncate(len);
28
29         Ok(buffer)
30     }
31 }
32
33 pub struct RemoteSrv;
34 impl UdpPeer for RemoteSrv {
35     type Sender = ToSrv;
36     type Receiver = FromSrv;
37 }
38
39 pub async fn connect(addr: &str) -> io::Result<(RudpSender<RemoteSrv>, RudpReceiver<RemoteSrv>)> {
40     let sock = Arc::new(net::UdpSocket::bind("0.0.0.0:0").await?);
41     sock.connect(addr).await?;
42
43     new(
44         PeerID::Srv as u16,
45         PeerID::Nil as u16,
46         ToSrv(Arc::clone(&sock)),
47         FromSrv(sock),
48     )
49     .await
50 }