diff --git a/Cargo.toml b/Cargo.toml index 2c82cb5..52d5408 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,8 @@ ar = "/usr/bin/x86_64-w64-mingw32-ar" linker = "/usr/bin/i686-w64-mingw32-gcc" ar = "/usr/bin/i686-w64-mingw32-ar" +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" [features] no-timeout = [] diff --git a/src/client/main.rs b/src/client/main.rs index 9ef69e8..3cc3541 100644 --- a/src/client/main.rs +++ b/src/client/main.rs @@ -186,6 +186,17 @@ fn main() -> std::io::Result<()> { &iv, ) .unwrap(); + + let _ = net::send_heartbeat( + // send heart beat to start periodic heart beat + &mut buf, + &server_SocketAddr, + socket.clone(), + &tmp_v_net, + &public_sock_addr, + &iv, + ); + tmp_v_net } Err(e) => { diff --git a/src/client/net.rs b/src/client/net.rs index 7256f46..6679dc8 100644 --- a/src/client/net.rs +++ b/src/client/net.rs @@ -727,6 +727,9 @@ pub async fn handle_incoming_connection( "[SUCCESS]".green() ); } + x if x == ServerMethods::HEARTBEAT as u8 => { + println!("{} heart beat recive confirmed", "[OK]".green()); + } _ => { eprintln!( "{} unknown method ID: 0x{:02x}, Droping!", @@ -738,6 +741,7 @@ pub async fn handle_incoming_connection( } pub fn periodic_heart_beat(socket: Arc, send_buf: Box<[u8]>, dst: SocketAddr) { + println!("{} periodic heartbeat started", "[LOG]".blue()); loop { std::thread::sleep(std::time::Duration::from_secs(30)); println!("{} sending heartbeat to server", "[LOG]".blue()); diff --git a/src/server/net.rs b/src/server/net.rs index 968dab5..0c2060a 100644 --- a/src/server/net.rs +++ b/src/server/net.rs @@ -64,7 +64,7 @@ pub async fn handle_request( let registration = match registration_vector .iter() - .find(|elem| elem.map(|s| &s.net_id == &net_id)) // find if id exists + .find(|elem| elem.map(|s| &s.net_id == &net_id && !s.invalid)) // find if id exists { Some(registration) => registration, None => {futures::executor::block_on(send_with_count(socket, &src ,&[ServerResponse::ID_DOESNT_EXIST as u8])); @@ -163,7 +163,7 @@ pub async fn handle_request( match registration_vector .iter() - .find(|elem| elem.map(|s| &s.net_id == &net_id)) // find if id exists + .find(|elem| elem.map(|s| &s.net_id == &net_id && !s.invalid)) // find if id exists { Some(_) => { futures::executor::block_on(send_with_count(socket, &src, &[ServerResponse::ID_EXISTS as u8])); @@ -216,7 +216,25 @@ pub async fn handle_request( .collect::(), ); - registration_vector.push(types::Registration::new( + let mut first_invalid_registration: Option = None; + + for (i, reg) in registration_vector.iter().enumerate() { + if reg.map(|r| r.invalid) { + first_invalid_registration = Some(i); + break; + } + } + match first_invalid_registration { + Some(i) => registration_vector[i].update(|r|{*r = types::Registration::new( + net_id.clone(), + client_sock_addr.clone(), + encrypted, + chrono::Utc::now().timestamp(), + salt, + iv, + src + );}), + None => {registration_vector.push(types::Registration::new( net_id, client_sock_addr, encrypted, @@ -224,7 +242,9 @@ pub async fn handle_request( salt, iv, src - )); + ));}, + }; + send_with_count(socket, &src, &[ServerMethods::REGISTER as u8]).await; #[cfg(debug_assertions)] println!("network registered");