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