♻️ refactor: literal translation to async

main
_ 2021-12-09 00:34:59 +00:00
parent bf9d185092
commit 5d8bb3282b
3 changed files with 41 additions and 18 deletions

12
Cargo.lock generated
View File

@ -236,9 +236,21 @@ dependencies = [
"libc", "libc",
"mio", "mio",
"pin-project-lite", "pin-project-lite",
"tokio-macros",
"winapi", "winapi",
] ]
[[package]]
name = "tokio-macros"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "unicode-xid" name = "unicode-xid"
version = "0.2.2" version = "0.2.2"

View File

@ -15,7 +15,7 @@ version = "0.1.4"
mac_address = "1.1.2" mac_address = "1.1.2"
rand = "0.8.4" rand = "0.8.4"
thiserror = "1.0.30" thiserror = "1.0.30"
tokio = { version = "1.14.0", features = ["fs", "net", "rt", "time"] } tokio = { version = "1.14.0", features = ["fs", "macros", "net", "rt", "time"] }
[profile.release] [profile.release]
codegen-units = 1 codegen-units = 1

View File

@ -5,7 +5,6 @@ use std::{
Ipv4Addr, Ipv4Addr,
SocketAddr, SocketAddr,
SocketAddrV4, SocketAddrV4,
UdpSocket,
}, },
str::FromStr, str::FromStr,
time::{Duration, Instant}, time::{Duration, Instant},
@ -16,6 +15,11 @@ use mac_address::{
get_mac_address, get_mac_address,
}; };
use thiserror::Error; use thiserror::Error;
use tokio::{
net::UdpSocket,
select,
time::sleep,
};
mod ip; mod ip;
mod message; mod message;
@ -76,7 +80,10 @@ impl Default for CommonParams {
} }
fn main () -> Result <(), AppError> { fn main () -> Result <(), AppError> {
let rt = tokio::runtime::Builder::new_current_thread ().build ()?; let rt = tokio::runtime::Builder::new_current_thread ()
.enable_io ()
.enable_time ()
.build ()?;
rt.block_on (async_main ())?; rt.block_on (async_main ())?;
@ -100,9 +107,9 @@ async fn async_main () -> Result <(), AppError> {
match subcommand.as_ref ().map (|x| &x[..]) { match subcommand.as_ref ().map (|x| &x[..]) {
None => return Err (CliArgError::MissingSubcommand.into ()), None => return Err (CliArgError::MissingSubcommand.into ()),
Some ("client") => client (args)?, Some ("client") => client (args).await?,
Some ("my-ips") => my_ips ()?, Some ("my-ips") => my_ips ()?,
Some ("server") => server (args)?, Some ("server") => server (args).await?,
Some (x) => return Err (CliArgError::UnknownSubcommand (x.to_string ()).into ()), Some (x) => return Err (CliArgError::UnknownSubcommand (x.to_string ()).into ()),
} }
@ -145,7 +152,7 @@ struct ServerResponse {
nickname: Option <String>, nickname: Option <String>,
} }
fn client <I : Iterator <Item=String>> (mut args: I) -> Result <(), AppError> { async fn client <I : Iterator <Item=String>> (mut args: I) -> Result <(), AppError> {
use rand::RngCore; use rand::RngCore;
let common_params = CommonParams::default (); let common_params = CommonParams::default ();
@ -163,10 +170,9 @@ fn client <I : Iterator <Item=String>> (mut args: I) -> Result <(), AppError> {
} }
} }
let socket = UdpSocket::bind (&format! ("{}:0", bind_addr))?; let socket = UdpSocket::bind (&format! ("{}:0", bind_addr)).await?;
socket.join_multicast_v4 (&common_params.multicast_addr, &Ipv4Addr::from_str (&bind_addr)?)?; socket.join_multicast_v4 (common_params.multicast_addr, Ipv4Addr::from_str (&bind_addr)?)?;
socket.set_read_timeout (Some (Duration::from_millis (1_000)))?;
let mut idem_id = [0u8; 8]; let mut idem_id = [0u8; 8];
rand::thread_rng ().fill_bytes (&mut idem_id); rand::thread_rng ().fill_bytes (&mut idem_id);
@ -177,7 +183,7 @@ fn client <I : Iterator <Item=String>> (mut args: I) -> Result <(), AppError> {
}.to_vec ()?; }.to_vec ()?;
for _ in 0..10 { for _ in 0..10 {
socket.send_to (&msg, (common_params.multicast_addr, common_params.server_port))?; socket.send_to (&msg, (common_params.multicast_addr, common_params.server_port)).await?;
std::thread::sleep (Duration::from_millis (100)); std::thread::sleep (Duration::from_millis (100));
} }
@ -186,7 +192,12 @@ fn client <I : Iterator <Item=String>> (mut args: I) -> Result <(), AppError> {
let mut peers = HashMap::with_capacity (10); let mut peers = HashMap::with_capacity (10);
while Instant::now () < start_time + Duration::from_secs (2) { while Instant::now () < start_time + Duration::from_secs (2) {
let (msgs, remote_addr) = match recv_msg_from (&socket) { let x = select! {
x = recv_msg_from (&socket) => x,
() = sleep (Duration::from_millis (1_000)) => continue,
};
let (msgs, remote_addr) = match x {
Err (_) => continue, Err (_) => continue,
Ok (x) => x, Ok (x) => x,
}; };
@ -234,7 +245,7 @@ fn client <I : Iterator <Item=String>> (mut args: I) -> Result <(), AppError> {
Ok (()) Ok (())
} }
fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), AppError> async fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), AppError>
{ {
let common_params = CommonParams::default (); let common_params = CommonParams::default ();
let mut bind_addr = "0.0.0.0".to_string (); let mut bind_addr = "0.0.0.0".to_string ();
@ -263,15 +274,15 @@ fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), AppError>
println! ("Warning: Can't find our own MAC address. We won't be able to respond to MAC-specific lookaround requests"); println! ("Warning: Can't find our own MAC address. We won't be able to respond to MAC-specific lookaround requests");
} }
let socket = UdpSocket::bind (SocketAddrV4::new (Ipv4Addr::from_str (&bind_addr)?, common_params.server_port)).unwrap (); let socket = UdpSocket::bind (SocketAddrV4::new (Ipv4Addr::from_str (&bind_addr)?, common_params.server_port)).await.unwrap ();
socket.join_multicast_v4 (&common_params.multicast_addr, &([0u8, 0, 0, 0].into ())).unwrap (); socket.join_multicast_v4 (common_params.multicast_addr, [0u8, 0, 0, 0].into ()).unwrap ();
let mut recent_idem_ids = Vec::with_capacity (32); let mut recent_idem_ids = Vec::with_capacity (32);
loop { loop {
println! ("Waiting for messages..."); println! ("Waiting for messages...");
let (req_msgs, remote_addr) = recv_msg_from (&socket)?; let (req_msgs, remote_addr) = recv_msg_from (&socket).await?;
let req = match req_msgs.into_iter ().next () { let req = match req_msgs.into_iter ().next () {
Some (x) => x, Some (x) => x,
@ -306,15 +317,15 @@ fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), AppError>
}; };
if let Some (resp) = resp { if let Some (resp) = resp {
socket.send_to (&Message::many_to_vec (&resp)?, remote_addr).unwrap (); socket.send_to (&Message::many_to_vec (&resp)?, remote_addr).await.unwrap ();
} }
} }
} }
fn recv_msg_from (socket: &UdpSocket) -> Result <(Vec <Message>, SocketAddr), AppError> async fn recv_msg_from (socket: &UdpSocket) -> Result <(Vec <Message>, SocketAddr), AppError>
{ {
let mut buf = vec! [0u8; PACKET_SIZE]; let mut buf = vec! [0u8; PACKET_SIZE];
let (bytes_recved, remote_addr) = socket.recv_from (&mut buf)?; let (bytes_recved, remote_addr) = socket.recv_from (&mut buf).await?;
buf.truncate (bytes_recved); buf.truncate (bytes_recved);
let msgs = Message::from_slice2 (&buf)?; let msgs = Message::from_slice2 (&buf)?;