49 lines
1.7 KiB
Rust
49 lines
1.7 KiB
Rust
use std::thread;
|
|
use astro_dnssd::register::DNSServiceBuilder;
|
|
use multicast_dns::discovery::{DiscoveryManager, DiscoveryListeners, ResolveListeners};
|
|
use crate::{constants, print_error};
|
|
|
|
const SERVICE_TYPE: &str = "_aira._tcp";
|
|
|
|
pub fn advertise_me(){
|
|
thread::spawn(||{
|
|
let mut service = DNSServiceBuilder::new(SERVICE_TYPE)
|
|
.with_name("AIRA Node")
|
|
.with_port(constants::PORT.parse().unwrap())
|
|
.build()
|
|
.unwrap();
|
|
match service.register(|reply| match reply {
|
|
Ok(_) => {},
|
|
Err(e) => println!("Error registering: {:?}", e)
|
|
}) {
|
|
Ok(_) => {
|
|
loop {
|
|
service.process_result();
|
|
}
|
|
}
|
|
Err(e) => println!("Unable to register mDNS service. You won't be discoverable by others peers. {}", e)
|
|
};
|
|
});
|
|
}
|
|
|
|
pub fn discover_peers<F: Fn(&DiscoveryManager, String)>(on_service_discovered: F){
|
|
let discovery_manager = DiscoveryManager::new();
|
|
let result = discovery_manager.discover_services(SERVICE_TYPE, DiscoveryListeners{
|
|
on_service_discovered: Some(&|service| {
|
|
discovery_manager.resolve_service(service, ResolveListeners{
|
|
on_service_resolved: Some(&|service| {
|
|
match service.address {
|
|
Some(service_ip) => on_service_discovered(&discovery_manager, service_ip),
|
|
None => println!("Service discovered without IP address: {:?}", service)
|
|
};
|
|
})
|
|
});
|
|
}),
|
|
on_all_discovered: Some(&|| {
|
|
discovery_manager.stop_service_discovery();
|
|
})
|
|
});
|
|
if result.is_err() {
|
|
print_error(result.err().unwrap());
|
|
}
|
|
} |