raw lan discovery

This commit is contained in:
open-trade
2022-01-11 16:24:35 +08:00
parent 9c9855877d
commit 65eef2b579
3 changed files with 57 additions and 2 deletions

View File

@@ -12,11 +12,11 @@ use hbb_common::{
self, select,
time::{interval, Duration},
},
udp::FramedSocket,
udp::{self, FramedSocket},
AddrMangle, IntoTargetAddr, ResultType, TargetAddr,
};
use std::{
net::SocketAddr,
net::{SocketAddr, SocketAddrV4},
sync::{
atomic::{AtomicBool, Ordering},
Arc, Mutex,
@@ -59,6 +59,9 @@ impl RendezvousMediator {
tokio::spawn(async move {
allow_err!(direct_server(server_cloned).await);
});
tokio::spawn(async move {
allow_err!(lan_discovery().await);
});
loop {
Config::reset_online();
if Config::get_option("stop-service").is_empty() {
@@ -501,3 +504,43 @@ async fn direct_server(server: ServerPtr) -> ResultType<()> {
}
}
}
pub fn create_multicast_socket() -> ResultType<FramedSocket> {
let port = (RENDEZVOUS_PORT + 3) as u16;
udp::bind_multicast(
&SocketAddrV4::new([0, 0, 0, 0].into(), port),
&SocketAddrV4::new([239, 255, 42, 98].into(), port),
)
}
async fn lan_discovery() -> ResultType<()> {
let mut socket = create_multicast_socket()?;
loop {
select! {
Some(Ok((bytes, _))) = socket.next() => {
if let Ok(msg_in) = Message::parse_from_bytes(&bytes) {
match msg_in.union {
Some(rendezvous_message::Union::peer_discovery(p)) => {
if p.cmd == "ping" {
let mut msg_out = Message::new();
let peer = PeerDiscovery {
cmd: "pong".to_owned,
mac: hbb_common::mac_address::get_mac_address()?,
id: Config::get_id(),
hostname: whoami::hostname(),
username: crate::platform::get_active_username(),
platform: whoami::platform().to_string(),
...Default::default(),
};
msg_out.set_peer_discovery(peer);
socket.send(&msg_out).await?;
}
}
_ => {}
}
}
}
}
}
Ok(())
}