]> git.lizzy.rs Git - mt_rudp.git/blobdiff - examples/example.rs
cleanup; readme
[mt_rudp.git] / examples / example.rs
diff --git a/examples/example.rs b/examples/example.rs
new file mode 100644 (file)
index 0000000..0a6dc42
--- /dev/null
@@ -0,0 +1,54 @@
+use byteorder::{BigEndian, WriteBytesExt};
+use mt_rudp::{Client, RudpReceiver, RudpSender};
+use pretty_hex::PrettyHex;
+use std::io::{self, Write};
+
+async fn example(tx: &RudpSender<Client>, rx: &mut RudpReceiver<Client>) -> io::Result<()> {
+    // send hello packet
+    let mut pkt = vec![];
+    pkt.write_u16::<BigEndian>(2)?; // high level type
+    pkt.write_u8(29)?; // serialize ver
+    pkt.write_u16::<BigEndian>(0)?; // compression modes
+    pkt.write_u16::<BigEndian>(40)?; // MinProtoVer
+    pkt.write_u16::<BigEndian>(40)?; // MaxProtoVer
+    pkt.write_u16::<BigEndian>(3)?; // player name length
+    pkt.write(b"foo")?; // player name
+
+    tx.send(mt_rudp::Pkt {
+        unrel: true,
+        chan: 1,
+        data: &pkt,
+    })
+    .await?;
+
+    // handle incoming packets
+    while let Some(result) = rx.recv().await {
+        match result {
+            Ok(pkt) => {
+                println!("{}", pkt.data.hex_dump());
+            }
+            Err(err) => eprintln!("Error: {}", err),
+        }
+    }
+
+    Ok(())
+}
+
+#[tokio::main]
+async fn main() -> io::Result<()> {
+    let (tx, mut rx) = mt_rudp::connect("127.0.0.1:30000").await?;
+
+    tokio::select! {
+        _ = tokio::signal::ctrl_c() => println!("canceled"),
+        res = example(&tx, &mut rx) => {
+            res?;
+            println!("disconnected");
+        }
+    }
+
+    // close either the receiver or the sender
+    // this shuts down associated tasks
+    rx.close().await;
+
+    Ok(())
+}