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