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