♻️ refactor: preparing to serve on multiple interfaces
parent
39bcea54d4
commit
1b7c2ce0f4
|
@ -29,6 +29,7 @@ pub use crate::{
|
|||
CliArgError,
|
||||
recv_msg_from,
|
||||
},
|
||||
ip::get_ips,
|
||||
message::{
|
||||
self,
|
||||
PACKET_SIZE,
|
||||
|
|
|
@ -1,9 +1,29 @@
|
|||
use crate::prelude::*;
|
||||
|
||||
pub async fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), AppError>
|
||||
struct Params {
|
||||
common: app_common::Params,
|
||||
bind_addr: Ipv4Addr,
|
||||
nickname: String,
|
||||
our_mac: Option <[u8; 6]>,
|
||||
}
|
||||
|
||||
pub async fn server <I: Iterator <Item=String>> (args: I) -> Result <(), AppError>
|
||||
{
|
||||
let common_params = app_common::Params::default ();
|
||||
let mut bind_addr = "0.0.0.0".to_string ();
|
||||
let params = configure (args)?;
|
||||
|
||||
let socket = UdpSocket::bind (SocketAddrV4::new (params.bind_addr, params.common.server_port)).await?;
|
||||
|
||||
socket.join_multicast_v4 (params.common.multicast_addr, [0u8, 0, 0, 0].into ())?;
|
||||
|
||||
serve_interface (¶ms, socket).await?;
|
||||
|
||||
Ok (())
|
||||
}
|
||||
|
||||
fn configure <I: Iterator <Item=String>> (mut args: I) -> Result <Params, AppError>
|
||||
{
|
||||
let common = app_common::Params::default ();
|
||||
let mut bind_addr = Ipv4Addr::UNSPECIFIED;
|
||||
let mut nickname = String::new ();
|
||||
|
||||
while let Some (arg) = args.next () {
|
||||
|
@ -11,7 +31,7 @@ pub async fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), App
|
|||
"--bind-addr" => {
|
||||
bind_addr = match args.next () {
|
||||
None => return Err (CliArgError::MissingArgumentValue (arg).into ()),
|
||||
Some (x) => x
|
||||
Some (x) => Ipv4Addr::from_str (&x)?,
|
||||
};
|
||||
},
|
||||
"--nickname" => {
|
||||
|
@ -29,14 +49,20 @@ pub async fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), App
|
|||
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)).await?;
|
||||
|
||||
socket.join_multicast_v4 (common_params.multicast_addr, [0u8, 0, 0, 0].into ())?;
|
||||
Ok (Params {
|
||||
common,
|
||||
bind_addr,
|
||||
nickname,
|
||||
our_mac,
|
||||
})
|
||||
}
|
||||
|
||||
async fn serve_interface (params: &Params, socket: UdpSocket)
|
||||
-> Result <(), AppError>
|
||||
{
|
||||
let mut recent_idem_ids = Vec::with_capacity (32);
|
||||
|
||||
loop {
|
||||
println! ("Waiting for messages...");
|
||||
let (req_msgs, remote_addr) = match recv_msg_from (&socket).await {
|
||||
Ok (x) => x,
|
||||
Err (e) => {
|
||||
|
@ -59,17 +85,16 @@ pub async fn server <I: Iterator <Item=String>> (mut args: I) -> Result <(), App
|
|||
idem_id,
|
||||
} => {
|
||||
if recent_idem_ids.contains (&idem_id) {
|
||||
println! ("Ignoring request we already processed");
|
||||
None
|
||||
}
|
||||
else {
|
||||
recent_idem_ids.insert (0, idem_id);
|
||||
recent_idem_ids.truncate (30);
|
||||
Some (vec! [
|
||||
Message::Response1 (our_mac),
|
||||
Message::Response1 (params.our_mac),
|
||||
Message::Response2 (message::Response2 {
|
||||
idem_id,
|
||||
nickname: nickname.clone (),
|
||||
nickname: params.nickname.clone (),
|
||||
}),
|
||||
])
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue