If you're looking to easily send and receive Udp Messages then this crate is perfect for you. It gives you the ability to define your own Net Messages by simply creating a struct and implementing a trait.
If you have any suggestions for this crate, let me know! If something is not clear or confusing, let me know!
```rust use udp_netmsg::{NetMessenger, Datagram}; use std::io::Cursor; use byteorder::{BigEndian,ReadBytesExt, WriteBytesExt};
struct UpdatePos { pub id: u32, pub x: f32, pub y: f32, pub z: f32 }
impl Datagram for UpdatePos {
fn frombuffer(mut buffer: Cursor
fn to_buffer(&self)->Vec<u8> {
let mut wtr: Vec<u8> = Vec::new();
//this buffer is 16 + 4 more for the header
wtr.write_u32::<BigEndian>(self.id).unwrap();
wtr.write_f32::<BigEndian>(self.x).unwrap();
wtr.write_f32::<BigEndian>(self.y).unwrap();
wtr.write_f32::<BigEndian>(self.z).unwrap();
return wtr
}
fn header()->u32 {return 834227670}
} fn main() {
let source_ip = String::from("0.0.0.0:12000");
let dest_ip = String::from("127.0.0.1:12000");
let recv_buffer_size_bytes = 30;
let mut net_msg = NetMessenger::new(
source_ip,
dest_ip,
recv_buffer_size_bytes);
//register the struct so it knows how to read datagram!
net_msg.register(UpdatePos::header(), UpdatePos::from_buffer);
match net_msg.send(Box::from(UpdatePos{id: 16, x: 5.0f32, y:5.0f32, z:5.0f32}), true) {
Ok(_) => println!("datagram sent!"),
Err(e) => println!("datagram failed to send because: {}", e)
}
//msg.recv(...) returns Some(datagram) or None
match net_msg.recv(false, true) {
//Some(Msg: Box<Datagram>)
Some(msg) => {
//now downcast to particular struct here
if let Some(t) = msg.downcast_ref::<UpdatePos>() {
println!("Received: [id {} at ({},{},{})]", t.id, t.x, t.y, t.z);}
//else if let Some(t) = msg.downcast_ref::<Another msg type>() {}
}
None => {println!("no Datagram received!")}
}
} ```