Implement AutoConnect
This commit is contained in:
45
server/texture-sync-server/src/protocol/autoconnect/mod.rs
Normal file
45
server/texture-sync-server/src/protocol/autoconnect/mod.rs
Normal file
@ -0,0 +1,45 @@
|
||||
use super::ProtocolConfig;
|
||||
|
||||
use std::thread;
|
||||
use std::net::UdpSocket;
|
||||
use std::io;
|
||||
use std::net::SocketAddr;
|
||||
use std::net::ToSocketAddrs;
|
||||
use std::net::Ipv6Addr;
|
||||
use std::str::FromStr;
|
||||
|
||||
pub fn start_autoconnect_server_async(cfg : &ProtocolConfig) -> io::Result<()> {
|
||||
let cfg = cfg.clone();
|
||||
|
||||
let multi_sock = UdpSocket::bind((cfg.listen_addr.as_str(), cfg.port))?;
|
||||
|
||||
multi_sock.join_multicast_v6(
|
||||
&Ipv6Addr::from_str(&cfg.autoconnect_multicastv6_addr).map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "Configured IPv6 addr. is invalid."))?,
|
||||
0)?;
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut buffer = vec![0u8; 8096];
|
||||
loop {
|
||||
match multi_sock.recv_from(&mut buffer) {
|
||||
Ok( (pkg_size, sender)) => {
|
||||
respond(&multi_sock, &buffer[0..pkg_size], &sender, &cfg);
|
||||
},
|
||||
Err( e ) => {
|
||||
println!("[Autoconnect] failed with : {:?}", e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn respond(sock : &UdpSocket, input : &[u8], sender : &SocketAddr, cfg : &ProtocolConfig) -> io::Result<()> {
|
||||
if input == b"TextureSync" {
|
||||
println!("[Autoconnect] Got request from : {}", sender);
|
||||
sock.send_to(&u16::to_be_bytes(cfg.port), sender)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
Reference in New Issue
Block a user