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