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