aboutsummaryrefslogtreecommitdiff
path: root/src/client.rs
diff options
context:
space:
mode:
authorLizzy Fleckenstein <eliasfleckenstein@web.de>2022-12-22 23:02:33 +0100
committerLizzy Fleckenstein <eliasfleckenstein@web.de>2022-12-22 23:02:33 +0100
commit58100eb80dc20283e3b4de178082ef17f6213551 (patch)
treed88135e35f7aa13c7deb3d85aad3e323bdee2618 /src/client.rs
parent209fcdbebf6354fe3246938e46dac516c6205630 (diff)
downloadmt_rudp-58100eb80dc20283e3b4de178082ef17f6213551.tar.xz
files
Diffstat (limited to 'src/client.rs')
-rw-r--r--src/client.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/client.rs b/src/client.rs
new file mode 100644
index 0000000..e506a3e
--- /dev/null
+++ b/src/client.rs
@@ -0,0 +1,52 @@
+use crate::{PeerID, UdpReceiver, UdpSender};
+use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
+use num_enum::{TryFromPrimitive, TryFromPrimitiveError};
+use std::{
+ cell::Cell,
+ fmt,
+ io::{self, Write},
+ net, ops,
+ sync::{mpsc, Arc},
+ thread,
+};
+
+pub struct Sender {
+ sock: Arc<net::UdpSocket>,
+}
+
+impl UdpSender for Sender {
+ fn send(&self, data: Vec<u8>) -> io::Result<()> {
+ self.sock.send(&data)?;
+ Ok(())
+ }
+}
+
+pub struct Receiver {
+ sock: Arc<net::UdpSocket>,
+}
+
+impl UdpReceiver for Receiver {
+ fn recv(&self) -> io::Result<Vec<u8>> {
+ let mut buffer = Vec::new();
+ buffer.resize(crate::UDP_PKT_SIZE, 0);
+
+ let len = self.sock.recv(&mut buffer)?;
+ buffer.truncate(len);
+
+ Ok(buffer)
+ }
+}
+
+pub fn connect(addr: &str) -> io::Result<(crate::RudpSender<Sender>, crate::RudpReceiver<Sender>)> {
+ let sock = Arc::new(net::UdpSocket::bind("0.0.0.0:0")?);
+ sock.connect(addr)?;
+
+ Ok(crate::new(
+ PeerID::Srv as u16,
+ PeerID::Nil as u16,
+ Sender {
+ sock: Arc::clone(&sock),
+ },
+ Receiver { sock },
+ ))
+}