switch to thiserror and optimize release builds for size
parent
73b93d99af
commit
c356ed9cc3
|
@ -2,15 +2,64 @@
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anyhow"
|
|
||||||
version = "1.0.48"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "62e1f47f7dc0422027a4e370dd4548d4d66b26782e513e98dca1e689e058a80e"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lookaround"
|
name = "lookaround"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.82"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "1.0.30"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "1.0.30"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
||||||
|
|
|
@ -6,4 +6,10 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.48"
|
thiserror = "1.0.30"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
codegen-units = 1
|
||||||
|
lto = true
|
||||||
|
opt-level = "z"
|
||||||
|
panic = "abort"
|
||||||
|
|
61
src/main.rs
61
src/main.rs
|
@ -2,46 +2,75 @@ use std::{
|
||||||
env,
|
env,
|
||||||
net::{
|
net::{
|
||||||
Ipv4Addr,
|
Ipv4Addr,
|
||||||
|
SocketAddrV4,
|
||||||
UdpSocket,
|
UdpSocket,
|
||||||
},
|
},
|
||||||
str::FromStr,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::{
|
use thiserror::Error;
|
||||||
self,
|
|
||||||
Result,
|
|
||||||
bail,
|
|
||||||
};
|
|
||||||
|
|
||||||
fn main () -> Result <()> {
|
#[derive (Debug, Error)]
|
||||||
|
enum AppError {
|
||||||
|
#[error (transparent)]
|
||||||
|
CliArgs (#[from] CliArgError),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive (Debug, Error)]
|
||||||
|
enum CliArgError {
|
||||||
|
#[error ("First argument should be a subcommand")]
|
||||||
|
MissingSubcommand,
|
||||||
|
#[error ("Unknown subcommand `{0}`")]
|
||||||
|
UnknownSubcommand (String),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CommonParams {
|
||||||
|
// Servers bind on this port, clients must send to the port
|
||||||
|
server_port: u16,
|
||||||
|
|
||||||
|
// Clients and servers will all join the same multicast addr
|
||||||
|
multicast_addr: Ipv4Addr,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for CommonParams {
|
||||||
|
fn default () -> Self {
|
||||||
|
Self {
|
||||||
|
server_port: 9040,
|
||||||
|
multicast_addr: Ipv4Addr::new (225, 100, 99, 98),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main () -> Result <(), AppError> {
|
||||||
let mut args = env::args ();
|
let mut args = env::args ();
|
||||||
|
|
||||||
let _exe_name = args.next ();
|
let _exe_name = args.next ();
|
||||||
|
|
||||||
match args.next ().as_ref ().map (|s| &s[..]) {
|
match args.next ().as_ref ().map (|s| &s[..]) {
|
||||||
None => bail! ("First argument must be a subcommand"),
|
None => return Err (CliArgError::MissingSubcommand.into ()),
|
||||||
Some ("client") => client ()?,
|
Some ("client") => client ()?,
|
||||||
Some ("server") => server ()?,
|
Some ("server") => server ()?,
|
||||||
Some (x) => bail! ("Unknown subcommand {}", x),
|
Some (x) => return Err (CliArgError::UnknownSubcommand (x.to_string ()).into ()),
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok (())
|
Ok (())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn client () -> Result <()> {
|
fn client () -> Result <(), AppError> {
|
||||||
let socket = UdpSocket::bind ("0.0.0.0:9041").unwrap ();
|
let params = CommonParams::default ();
|
||||||
|
let socket = UdpSocket::bind ("0.0.0.0:0").unwrap ();
|
||||||
|
|
||||||
socket.join_multicast_v4 (&(Ipv4Addr::from_str ("225.100.99.98").unwrap ()), &([0u8, 0, 0, 0].into ())).unwrap ();
|
socket.join_multicast_v4 (¶ms.multicast_addr, &([0u8, 0, 0, 0].into ())).unwrap ();
|
||||||
|
|
||||||
socket.send_to ("hi there".as_bytes (), ("225.100.99.98", 9040)).unwrap ();
|
socket.send_to ("hi there".as_bytes (), (params.multicast_addr, params.server_port)).unwrap ();
|
||||||
|
|
||||||
Ok (())
|
Ok (())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn server () -> Result <()> {
|
fn server () -> Result <(), AppError> {
|
||||||
let socket = UdpSocket::bind ("0.0.0.0:9040").unwrap ();
|
let params = CommonParams::default ();
|
||||||
|
let socket = UdpSocket::bind (SocketAddrV4::new (Ipv4Addr::UNSPECIFIED, params.server_port)).unwrap ();
|
||||||
|
|
||||||
socket.join_multicast_v4 (&(Ipv4Addr::from_str ("225.100.99.98").unwrap ()), &([0u8, 0, 0, 0].into ())).unwrap ();
|
socket.join_multicast_v4 (¶ms.multicast_addr, &([0u8, 0, 0, 0].into ())).unwrap ();
|
||||||
|
|
||||||
let mut buf = vec! [0u8; 4096];
|
let mut buf = vec! [0u8; 4096];
|
||||||
let (bytes_recved, remote_addr) = socket.recv_from (&mut buf).unwrap ();
|
let (bytes_recved, remote_addr) = socket.recv_from (&mut buf).unwrap ();
|
||||||
|
|
Loading…
Reference in New Issue