Browse Source

disconnect plumbing

pbs
jake 5 years ago
parent
commit
a7cb592471
  1. 12
      src/common/clientpool.rs
  2. 13
      src/common/mainloop.rs

12
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<S> {
pub enum ClientPoolAction<R> {
NewClient(ClientId),
Packet(ClientId, R),
Disconnect(ClientId),
}
@ -127,7 +128,6 @@ impl<S, R> ClientPool<S, R> where
}
}
}
}
}
@ -146,7 +146,6 @@ impl<S, R> ClientPool<S, R> 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<S, R> ClientPool<S, R> 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);
},
_ => {},
}
}
}

13
src/common/mainloop.rs

@ -19,8 +19,8 @@ fn recv_from_clientpool<STATE, S, R, E>(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, S, R, E>(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, S, R, E>(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();
}
}
}
},

Loading…
Cancel
Save