From a7cb592471d3ee997cd65a62a9c1ee5409f9c333 Mon Sep 17 00:00:00 2001 From: jake Date: Fri, 10 Jan 2020 21:28:26 -0800 Subject: [PATCH] disconnect plumbing --- src/common/clientpool.rs | 12 +++++++----- src/common/mainloop.rs | 13 +++++++++---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/common/clientpool.rs b/src/common/clientpool.rs index 0d5dda2..3725565 100644 --- a/src/common/clientpool.rs +++ b/src/common/clientpool.rs @@ -6,7 +6,7 @@ use std::net::{SocketAddr, Ipv4Addr}; use std::sync::mpsc::TryRecvError; use mio::tcp::TcpListener; use mio::{Events, Poll, Token, Ready, PollOpt}; -use log::warn; +use log::{info, warn}; use crate::common::client::Client; use crate::common::serverstate::{SendServerPacket, RecvServerPacket, ClientId}; @@ -48,6 +48,7 @@ pub enum ClientAction { pub enum ClientPoolAction { NewClient(ClientId), Packet(ClientId, R), + Disconnect(ClientId), } @@ -127,7 +128,6 @@ impl ClientPool where } } } - } } @@ -146,7 +146,6 @@ impl ClientPool where Token(0) => self.new_client(), Token(1) => self.packet_to_send(), _ => { - let client_id = match self.client_ids.get(&event.token()) { Some(client_id) => client_id, None => continue, @@ -164,12 +163,15 @@ impl ClientPool where match client_read(&self.sender, client) { Ok(()) =>{}, Err(err) => { - warn!("pkt err: {:?}", err); match err { PacketNetworkError::ClientDisconnected => { + info!("client {:?} disconnected", client_id); self.poll.deregister(&client.socket).unwrap(); + self.sender.send(ClientPoolAction::Disconnect(*client_id)).unwrap(); + }, + _ => { + warn!("pkt err: {:?}", err); }, - _ => {}, } } } diff --git a/src/common/mainloop.rs b/src/common/mainloop.rs index 1e7b0f1..62b7a59 100644 --- a/src/common/mainloop.rs +++ b/src/common/mainloop.rs @@ -19,8 +19,8 @@ fn recv_from_clientpool(state: &mut STATE, Ok(incoming) => { match incoming { ClientPoolAction::NewClient(client_id) => { - for s in state.on_connect(client_id).into_iter() { - match s { + for action in state.on_connect(client_id).into_iter() { + match action { OnConnect::Cipher((in_cipher, out_cipher)) => { pool_send.send(ClientAction::EncryptionKeys(client_id, in_cipher, out_cipher)).unwrap(); } @@ -34,8 +34,8 @@ fn recv_from_clientpool(state: &mut STATE, let to_send = state.handle(client_id, &pkt); match to_send { Ok(pkts) => { - for p in pkts { - pool_send.send(ClientAction::Packet(p.0, p.1)).unwrap(); + for pkt in pkts { + pool_send.send(ClientAction::Packet(pkt.0, pkt.1)).unwrap(); } }, Err(err) => { @@ -43,6 +43,11 @@ fn recv_from_clientpool(state: &mut STATE, warn!("[handler error]: {:?} {:?}", client_id, err); } } + }, + ClientPoolAction::Disconnect(client_id) => { + for pkt in state.on_disconnect(client_id) { + pool_send.send(ClientAction::Packet(pkt.0, pkt.1)).unwrap(); + } } } },