# HG changeset patch # User alfadur # Date 1555362435 -10800 # Node ID b2beb784e4b552806a727734b04b4be29275326d # Parent 86dc602ed920fc300b9f186ced685e62b0457171 add support for multiple ping probes diff -r 86dc602ed920 -r b2beb784e4b5 rust/hedgewars-server/src/server/network.rs --- a/rust/hedgewars-server/src/server/network.rs Mon Apr 15 22:14:42 2019 +0200 +++ b/rust/hedgewars-server/src/server/network.rs Tue Apr 16 00:07:15 2019 +0300 @@ -39,7 +39,8 @@ const MAX_BYTES_PER_READ: usize = 2048; const SEND_PING_TIMEOUT: Duration = Duration::from_secs(30); -const DROP_CLIENT_TIMEOUT: Duration = Duration::from_secs(10); +const DROP_CLIENT_TIMEOUT: Duration = Duration::from_secs(30); +const PING_PROBES_COUNT: u8 = 2; #[derive(Hash, Eq, PartialEq, Copy, Clone)] pub enum NetworkClientState { @@ -304,7 +305,7 @@ } enum TimeoutEvent { - SendPing, + SendPing { probes_count: u8 }, DropClient, } @@ -323,10 +324,14 @@ timer: timer::Timer, } -fn create_ping_timeout(timer: &mut timer::Timer, client_id: ClientId) -> timer::Timeout { +fn create_ping_timeout( + timer: &mut timer::Timer, + probes_count: u8, + client_id: ClientId, +) -> timer::Timeout { timer.set_timeout( SEND_PING_TIMEOUT, - TimerData(TimeoutEvent::SendPing, client_id), + TimerData(TimeoutEvent::SendPing { probes_count }, client_id), ) } @@ -434,7 +439,7 @@ client_id, client_socket, addr, - create_ping_timeout(&mut self.timer, client_id), + create_ping_timeout(&mut self.timer, PING_PROBES_COUNT - 1, client_id), ); info!("client {} ({}) added", client.id, client.peer_addr); entry.insert(client); @@ -473,11 +478,16 @@ pub fn handle_timeout(&mut self, poll: &Poll) -> io::Result<()> { while let Some(TimerData(event, client_id)) = self.timer.poll() { match event { - TimeoutEvent::SendPing => { + TimeoutEvent::SendPing { probes_count } => { if let Some(ref mut client) = self.clients.get_mut(client_id) { client.send_string(&HWServerMessage::Ping.to_raw_protocol()); client.write()?; - client.replace_timeout(create_drop_timeout(&mut self.timer, client_id)); + let timeout = if probes_count != 0 { + create_ping_timeout(&mut self.timer, probes_count - 1, client_id) + } else { + create_drop_timeout(&mut self.timer, client_id) + }; + client.replace_timeout(timeout); } } TimeoutEvent::DropClient => { @@ -560,7 +570,11 @@ pub fn client_readable(&mut self, poll: &Poll, client_id: ClientId) -> io::Result<()> { let messages = if let Some(ref mut client) = self.clients.get_mut(client_id) { - let timeout = client.replace_timeout(create_ping_timeout(&mut self.timer, client_id)); + let timeout = client.replace_timeout(create_ping_timeout( + &mut self.timer, + PING_PROBES_COUNT - 1, + client_id, + )); self.timer.cancel_timeout(&timeout); client.read() } else {