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