From 00ec5547837dc2158be14fb7105cec4d5ea645b5 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sat, 23 May 2026 20:57:44 +0200 Subject: [PATCH] wait a little longer for broadcast response (#947) --- src/ui/netplay.rs | 70 +++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/src/ui/netplay.rs b/src/ui/netplay.rs index 1bf4f79..e7ed8c2 100644 --- a/src/ui/netplay.rs +++ b/src/ui/netplay.rs @@ -108,44 +108,50 @@ impl NetplayPages for NetplayJoin { } } +async fn get_local_servers() -> Vec<(String, String)> { + if let Ok(broadcast_sock) = + tokio::net::UdpSocket::bind((std::net::Ipv4Addr::UNSPECIFIED, 0)).await + && broadcast_sock.set_broadcast(true).is_ok() + { + let data: [u8; 1] = [1]; + if let Err(e) = broadcast_sock + .send_to(&data, (std::net::Ipv4Addr::BROADCAST, 45000)) + .await + { + eprintln!("Error sending broadcast: {}", e); + return vec![]; + } + let mut buffer = [0; 1024]; + if let Ok(Ok(result)) = tokio::time::timeout( + std::time::Duration::from_millis(500), + broadcast_sock.recv(&mut buffer), + ) + .await + && let Ok(data) = serde_json::from_slice::>( + &buffer[..result], + ) + { + let mut local_servers = vec![]; + for server in data.iter() { + local_servers.push((server.0.into(), server.1.into())); + } + local_servers + } else { + vec![] + } + } else { + eprintln!("Error creating netplay broadcast socket"); + vec![] + } +} + fn populate_server_names(weak: slint::Weak) { let task = ui::WEB_CLIENT .get("https://dispatch.gopher64.com/getRegions") .header("netplay-id", env!("NETPLAY_ID")) .send(); tokio::spawn(async move { - let mut local_servers: Vec<(String, String)> = vec![]; - - if let Ok(broadcast_sock) = - tokio::net::UdpSocket::bind((std::net::Ipv4Addr::UNSPECIFIED, 0)).await - && broadcast_sock.set_broadcast(true).is_ok() - { - let data: [u8; 1] = [1]; - if let Err(e) = broadcast_sock - .send_to(&data, (std::net::Ipv4Addr::BROADCAST, 45000)) - .await - { - eprintln!("Error sending broadcast: {}", e); - } - let mut buffer = [0; 1024]; - if let Ok(Ok(result)) = tokio::time::timeout( - std::time::Duration::from_millis(200), - broadcast_sock.recv(&mut buffer), - ) - .await - && let Ok(data) = serde_json::from_slice::>( - &buffer[..result], - ) - { - for server in data.iter() { - local_servers.push((server.0.into(), server.1.into())); - } - } - } else { - eprintln!("Error creating netplay broadcast socket"); - } - - let response = task.await; + let (response, local_servers) = tokio::join!(task, get_local_servers()); let public_servers = if let Ok(response) = response && let Ok(servers) = response.json::>().await {