From 97bd87640e114f8c76414daa5c926cdc1dd666bb Mon Sep 17 00:00:00 2001 From: ddidderr Date: Thu, 13 Nov 2025 20:50:43 +0100 Subject: [PATCH] mdns --- crates/lanspread-mdns/src/lib.rs | 28 +++++++++++-- crates/lanspread-peer/src/lib.rs | 72 ++++++++++++++++---------------- 2 files changed, 60 insertions(+), 40 deletions(-) diff --git a/crates/lanspread-mdns/src/lib.rs b/crates/lanspread-mdns/src/lib.rs index 3f08500..b351a40 100644 --- a/crates/lanspread-mdns/src/lib.rs +++ b/crates/lanspread-mdns/src/lib.rs @@ -47,7 +47,10 @@ impl Drop for MdnsAdvertiser { } } -pub fn discover_service(service_type: &str) -> eyre::Result { +pub fn discover_service( + service_type: &str, + ignore_addr: Option, +) -> eyre::Result { let mdns = ServiceDaemon::new().expect("Failed to create mDNS daemon."); let receiver = mdns.browse(service_type)?; @@ -67,9 +70,26 @@ pub fn discover_service(service_type: &str) -> eyre::Result { continue; } - if let Some(address) = info.get_addresses().iter().next() { - log::info!("Found server at {}:{}", address, info.get_port()); - return Ok((address.to_ip_addr(), info.get_port()).into()); + let mut ignored_match = false; + for address in info.get_addresses() { + let addr = SocketAddr::new(address.to_ip_addr(), info.get_port()); + + if ignore_addr.is_some_and(|ignore| ignore == addr) { + ignored_match = true; + log::trace!("Ignoring mDNS advertisement for local server at {addr}"); + continue; + } + + log::info!("Found server at {addr}"); + return Ok(addr); + } + + if ignored_match { + log::trace!( + "Only saw ignored mDNS advertisements (probably ourselves) for {:?}", + info.get_fullname() + ); + continue; } log::error!("No address found in mDNS response: {info:?}"); diff --git a/crates/lanspread-peer/src/lib.rs b/crates/lanspread-peer/src/lib.rs index 2454c34..8967ef6 100644 --- a/crates/lanspread-peer/src/lib.rs +++ b/crates/lanspread-peer/src/lib.rs @@ -1700,7 +1700,8 @@ async fn run_peer_discovery( log::info!("Starting peer discovery task"); loop { - let discovery_result = discover_service(LANSPREAD_SERVICE_TYPE); + let ignored_addr = { *local_peer_addr.read().await }; + let discovery_result = discover_service(LANSPREAD_SERVICE_TYPE, ignored_addr); match discovery_result { Ok(peer_addr) => { @@ -1710,43 +1711,42 @@ async fn run_peer_discovery( }; if is_self { log::trace!("Ignoring self advertisement at {peer_addr}"); - continue; - } + } else { + log::info!("Discovered peer at: {peer_addr}"); - log::info!("Discovered peer at: {peer_addr}"); - - // Add peer to database - let is_new_peer = { - let mut db = peer_game_db.write().await; - let peer_addresses = db.get_peer_addresses(); - if peer_addresses.contains(&peer_addr) { - false - } else { - db.add_peer(peer_addr); - true - } - }; - - if is_new_peer { - // Notify UI about new peer - if let Err(e) = tx_notify_ui.send(PeerEvent::PeerDiscovered(peer_addr)) { - log::error!("Failed to send PeerDiscovered event: {e}"); - } - - // Request games from this peer - let tx_notify_ui_clone = tx_notify_ui.clone(); - let peer_game_db_clone = peer_game_db.clone(); - tokio::spawn(async move { - if let Err(e) = request_games_from_peer( - peer_addr, - tx_notify_ui_clone, - peer_game_db_clone, - ) - .await - { - log::error!("Failed to request games from peer {peer_addr}: {e}"); + // Add peer to database + let is_new_peer = { + let mut db = peer_game_db.write().await; + let peer_addresses = db.get_peer_addresses(); + if peer_addresses.contains(&peer_addr) { + false + } else { + db.add_peer(peer_addr); + true } - }); + }; + + if is_new_peer { + // Notify UI about new peer + if let Err(e) = tx_notify_ui.send(PeerEvent::PeerDiscovered(peer_addr)) { + log::error!("Failed to send PeerDiscovered event: {e}"); + } + + // Request games from this peer + let tx_notify_ui_clone = tx_notify_ui.clone(); + let peer_game_db_clone = peer_game_db.clone(); + tokio::spawn(async move { + if let Err(e) = request_games_from_peer( + peer_addr, + tx_notify_ui_clone, + peer_game_db_clone, + ) + .await + { + log::error!("Failed to request games from peer {peer_addr}: {e}"); + } + }); + } } } Err(e) => {