]> git.lizzy.rs Git - mt_rudp.git/blob - src/client.rs
Rework structure
[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(&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 async fn connect(addr: &str) -> io::Result<(RudpSender<ToSrv>, RudpReceiver<ToSrv>)> {
34     let sock = Arc::new(net::UdpSocket::bind("0.0.0.0:0").await?);
35     sock.connect(addr).await?;
36
37     new(
38         PeerID::Srv as u16,
39         PeerID::Nil as u16,
40         ToSrv(Arc::clone(&sock)),
41         FromSrv(sock),
42     )
43     .await
44 }