]> git.lizzy.rs Git - mt_rudp.git/blob - examples/example.rs
cleanup; readme
[mt_rudp.git] / examples / example.rs
1 use byteorder::{BigEndian, WriteBytesExt};
2 use mt_rudp::{Client, RudpReceiver, RudpSender};
3 use pretty_hex::PrettyHex;
4 use std::io::{self, Write};
5
6 async fn example(tx: &RudpSender<Client>, rx: &mut RudpReceiver<Client>) -> io::Result<()> {
7     // send hello packet
8     let mut pkt = vec![];
9     pkt.write_u16::<BigEndian>(2)?; // high level type
10     pkt.write_u8(29)?; // serialize ver
11     pkt.write_u16::<BigEndian>(0)?; // compression modes
12     pkt.write_u16::<BigEndian>(40)?; // MinProtoVer
13     pkt.write_u16::<BigEndian>(40)?; // MaxProtoVer
14     pkt.write_u16::<BigEndian>(3)?; // player name length
15     pkt.write(b"foo")?; // player name
16
17     tx.send(mt_rudp::Pkt {
18         unrel: true,
19         chan: 1,
20         data: &pkt,
21     })
22     .await?;
23
24     // handle incoming packets
25     while let Some(result) = rx.recv().await {
26         match result {
27             Ok(pkt) => {
28                 println!("{}", pkt.data.hex_dump());
29             }
30             Err(err) => eprintln!("Error: {}", err),
31         }
32     }
33
34     Ok(())
35 }
36
37 #[tokio::main]
38 async fn main() -> io::Result<()> {
39     let (tx, mut rx) = mt_rudp::connect("127.0.0.1:30000").await?;
40
41     tokio::select! {
42         _ = tokio::signal::ctrl_c() => println!("canceled"),
43         res = example(&tx, &mut rx) => {
44             res?;
45             println!("disconnected");
46         }
47     }
48
49     // close either the receiver or the sender
50     // this shuts down associated tasks
51     rx.close().await;
52
53     Ok(())
54 }