diff --git a/src/server/client/client_profile.rs b/src/server/client/client_profile.rs index 33214f0..32f4d27 100644 --- a/src/server/client/client_profile.rs +++ b/src/server/client/client_profile.rs @@ -68,8 +68,8 @@ impl<'a> Client<'a> { } pub fn handle_connection(&mut self){ - self.stream.set_read_timeout(Some(Duration::from_millis(3000))).unwrap(); - //let mut buffer = [0; 1024]; + //self.stream.set_read_timeout(Some(Duration::from_millis(2000))).unwrap(); + self.stream.set_nonblocking(true).expect("set_nonblocking call failed"); while self.connected { match self.rx_channel.try_recv() { @@ -139,7 +139,7 @@ impl<'a> Client<'a> { self.server.remove_client(self.uuid.as_str()); - //self.stream.shutdown(Shutdown::Both).expect("shutdown call failed"); + self.stream.shutdown(Shutdown::Both).expect("shutdown call failed"); let params: HashMap = [(String::from("uuid"), self.uuid.clone())].iter().cloned().collect(); let command = Commands::ClientRemove(Some(params)); @@ -170,7 +170,7 @@ impl<'a> Client<'a> { } }, Err(_) => { - println!("no data read"); + //println!("no data read"); }, } } @@ -192,13 +192,12 @@ impl<'a> Client<'a> { let command = Commands::from(&buffer); Ok(command) - //match self.get_stream().read(&mut buffer) { - // Ok(_) => Commands::from(&buffer), - // Err(_) => Commands::Error(None), - //} } fn confirm_success(&self){ + self.stream.set_nonblocking(false).expect("set_nonblocking call failed"); + self.stream.set_read_timeout(Some(Duration::from_millis(3000))).expect("set_read_timeout call failed"); + match self.read_data() { Ok(command) => { match command { @@ -211,8 +210,15 @@ impl<'a> Client<'a> { }, } }, - Err(_) => println!("no success read"), + Err(_) => { + println!("no success read"); + let error = Commands::Error(None); + self.transmit_data(error.to_string().as_str()); + }, } + + self.stream.set_read_timeout(None).expect("set_read_timeout call failed"); + self.stream.set_nonblocking(true).expect("set_nonblocking call failed"); } #[deprecated(since="24.7.20", note="will be removed in future, please do not use!")] diff --git a/src/server/commands/mod.rs b/src/server/commands/mod.rs index 3d66cb5..2410836 100644 --- a/src/server/commands/mod.rs +++ b/src/server/commands/mod.rs @@ -206,6 +206,7 @@ impl ToString for Commands { impl From<&str> for Commands { fn from(data: &str) -> Self { + println!("HERE!!! {}", data); let regex = Regex::new(r###"(\?|!)([a-zA-z0-9]*):|([a-zA-z]*):([a-zA-Z0-9\-\+\[\]{}_=/]+|("(.*?)")+)"###).unwrap(); let mut iter = regex.find_iter(data); let command = iter.next().unwrap().as_str(); diff --git a/src/server/server_profile.rs b/src/server/server_profile.rs index 1755cd4..c2aaa1f 100644 --- a/src/server/server_profile.rs +++ b/src/server/server_profile.rs @@ -9,6 +9,7 @@ use std::sync::{Arc, Mutex}; use crossbeam_channel::Sender; use parking_lot::FairMutex; use std::collections::HashMap; +use std::io::Error; use dashmap::DashMap; use std::io::prelude::*; use regex::Regex; @@ -47,7 +48,6 @@ impl<'z> Server<'z> { pub fn start(&'static self) { let listener = TcpListener::bind(self.get_address()).unwrap(); - let mut buffer = [0; 1024]; loop { if let Ok((mut stream, addr)) = listener.accept() { @@ -56,45 +56,48 @@ impl<'z> Server<'z> { let request = Commands::Request(None); self.transmit_data(&stream, &request.to_string().as_str()); - stream.read(&mut buffer).unwrap(); - let command = Commands::from(&buffer); - - match command { - Commands::Connect(Some(data)) => { - let uuid = data.get("uuid").unwrap(); - let username = data.get("name").unwrap(); - let address = data.get("host").unwrap(); - let stream = Arc::new(stream); - let mut client = Client::new(self, stream, &uuid, &username, &address); - - let tx = client.get_transmitter(); + match self.read_data(&stream) { + Ok(command) => { + match command { + Commands::Connect(Some(data)) => { + let uuid = data.get("uuid").unwrap(); + let username = data.get("name").unwrap(); + let address = data.get("host").unwrap(); - let mut clients_hashmap = self.connected_clients.lock().unwrap(); - clients_hashmap.insert(uuid.to_string(), tx.clone()); - std::mem::drop(clients_hashmap); - - let success = Commands::Success(None); - tx.send(success).unwrap(); + let stream = Arc::new(stream); + let mut client = Client::new(self, stream, &uuid, &username, &address); + + let tx = client.get_transmitter(); - self.thread_pool.execute(move || { - client.handle_connection(); - }); - - let params: HashMap = [(String::from("name"), username.clone()), (String::from("host"), address.clone()), (String::from("uuid"), uuid.clone())].iter().cloned().collect(); - let new_client = Commands::Client(Some(params)); - self.update_all_clients(uuid.as_str(), new_client); - }, - Commands::Info(None) => { - let params: HashMap = [(String::from("name"), self.name.to_string().clone()), (String::from("owner"), self.author.to_string().clone())].iter().cloned().collect(); - let command = Commands::Success(Some(params)); - - self.transmit_data(&stream, command.to_string().as_str()); - }, - _ => { - println!("Invalid command!"); - self.transmit_data(&stream, Commands::Error(None).to_string().as_str()); + let mut clients_hashmap = self.connected_clients.lock().unwrap(); + clients_hashmap.insert(uuid.to_string(), tx.clone()); + std::mem::drop(clients_hashmap); + + let success = Commands::Success(None); + tx.send(success).unwrap(); + + self.thread_pool.execute(move || { + client.handle_connection(); + }); + + let params: HashMap = [(String::from("name"), username.clone()), (String::from("host"), address.clone()), (String::from("uuid"), uuid.clone())].iter().cloned().collect(); + let new_client = Commands::Client(Some(params)); + self.update_all_clients(uuid.as_str(), new_client); + }, + Commands::Info(None) => { + let params: HashMap = [(String::from("name"), self.name.to_string().clone()), (String::from("owner"), self.author.to_string().clone())].iter().cloned().collect(); + let command = Commands::Success(Some(params)); + + self.transmit_data(&stream, command.to_string().as_str()); + }, + _ => { + println!("Invalid command!"); + self.transmit_data(&stream, Commands::Error(None).to_string().as_str()); + }, + } }, + Err(_) => println!("ERROR: stream closed"), } } } @@ -109,8 +112,8 @@ impl<'z> Server<'z> { pub fn update_all_clients(&self, uuid: &str, command: Commands){ let clients = self.connected_clients.lock().unwrap(); - if clients.len() > 1 { - for tx in clients.values(){ + for (client_uuid, tx) in clients.iter() { + if uuid != client_uuid.to_string() { tx.send(command.clone()).unwrap(); } } @@ -134,6 +137,15 @@ impl<'z> Server<'z> { stream.flush().unwrap(); } + fn read_data(&self, mut stream: &TcpStream) -> Result { + let mut buffer = [0; 1024]; + + stream.read(&mut buffer)?; + let command = Commands::from(&buffer); + + Ok(command) + } + #[deprecated(since="24.7.20", note="will be removed in future, please do not use!")] #[allow(dead_code)] pub fn get_info(&self, tx: Sender) { @@ -222,6 +234,11 @@ mod tests{ } } + fn force_disconnect(mut stream: &TcpStream){ + let msg = "!disconnect:"; + transmit_data(&stream, msg); + } + #[test] fn test_server_connect(){ let mut buffer = [0; 1024]; @@ -245,6 +262,9 @@ mod tests{ let msg = b"!disconnect:"; stream.write(msg).unwrap(); + + let dur = time::Duration::from_millis(500); + thread::sleep(dur); } #[test] @@ -255,19 +275,17 @@ mod tests{ let mut stream = TcpStream::connect("0.0.0.0:6000").unwrap(); - stream.read(&mut buffer).unwrap(); - let mut command = Commands::from(&buffer); + let command = read_data(&stream); assert_eq!(command, Commands::Request(None)); - let msg = b"!info:"; - stream.write(msg).unwrap(); + let msg = "!info:"; + transmit_data(&stream, msg); - stream.read(&mut buffer).unwrap(); - command = Commands::from(&buffer); + let command = read_data(&stream); let params: HashMap = [(String::from("name"), String::from("test")), (String::from("owner"), String::from("test"))].iter().cloned().collect(); - assert_eq!(command, Commands::Success(Some(params))); + assert_eq!(command, Commands::Success(Some(params))); } #[test] @@ -286,6 +304,9 @@ mod tests{ let msg = "!disconnect:"; transmit_data(&stream, msg); + + let dur = time::Duration::from_millis(500); + thread::sleep(dur); } #[test] @@ -301,11 +322,11 @@ mod tests{ assert_eq!(command, Commands::Success(None)); - let msg = "!disconnect"; + let msg = "!disconnect:"; transmit_data(&stream, msg); - //let dur = time::Duration::from_millis(1000); - //thread::sleep(dur); + let dur = time::Duration::from_millis(500); + thread::sleep(dur); } @@ -398,8 +419,8 @@ mod tests{ transmit_data(&stream_three, msg); transmit_data(&stream_four, msg); - //let dur = time::Duration::from_millis(1000); - //thread::sleep(dur); + let dur = time::Duration::from_millis(500); + thread::sleep(dur); } #[test] @@ -438,6 +459,9 @@ mod tests{ let msg = "!disconnect:"; transmit_data(&stream_one, msg); transmit_data(&stream_two, msg); + + let dur = time::Duration::from_millis(500); + thread::sleep(dur); } #[test] @@ -474,5 +498,8 @@ mod tests{ let msg = "!disconnect:"; transmit_data(&stream_one, msg); + + let dur = time::Duration::from_millis(500); + thread::sleep(dur); } }