Asymmetric UDP LAN discovery in Rust (Windows ↔ Linux) – broadcast received only one way

⚓ Rust    📅 2026-01-01    👤 surdeus    👁️ 1      

surdeus

I’m implementing LAN peer discovery in Rust using UDP broadcast (Tokio).

Setup

  • Windows + Fedora Linux
  • Same Wi-Fi network
  • UDP port 7777
  • tokio::net::UdpSocket

Issue

  • :white_check_mark: Linux can discover Windows
  • :cross_mark: Windows cannot discover Linux
    So discovery only works one way.

Broadcast sender:

let socket = UdpSocket::bind("0.0.0.0:0").await?;
socket.set_broadcast(true)?;
socket.send_to(b"COPYD_DISCOVER", "255.255.255.255:7777").await?;

Listener:

let socket = UdpSocket::bind("0.0.0.0:7777").await?;
socket.set_broadcast(true)?;

let (size, addr) = socket.recv_from(&mut buffer).await?;
if &buffer[..size] == b"COPYD_DISCOVER" {
    socket.send_to(b"COPYD_PEER", addr).await?;
}

Checks done

  • Windows Defender firewall allows UDP
  • Fedora firewall allows UDP 7777
  • No VPN, same subnet

Questions

  1. Is 255.255.255.255 unreliable for Windows → Linux discovery?
  2. Should I send subnet-directed broadcasts (e.g. 192.168.x.255) instead?
  3. Are there OS differences in handling UDP broadcast with Tokio?
  4. What’s the recommended cross-platform LAN discovery pattern in Rust?

Any guidance from people who’ve done cross-platform UDP discovery would help a lot. Thanks!

1 post - 1 participant

Read full topic

🏷️ Rust_feed