rust/hedgewars-server/src/server/network.rs
changeset 15520 fd3a20e9d095
parent 15517 abd5eb807166
child 15530 a859f08ebb4f
equal deleted inserted replaced
15519:b3157d218ae2 15520:fd3a20e9d095
    16 use mio_extras::timer;
    16 use mio_extras::timer;
    17 use netbuf;
    17 use netbuf;
    18 use slab::Slab;
    18 use slab::Slab;
    19 
    19 
    20 use crate::{
    20 use crate::{
    21     core::{server::HwServer, types::ClientId},
    21     core::types::ClientId,
    22     handlers,
    22     handlers,
    23     handlers::{IoResult, IoTask},
    23     handlers::{IoResult, IoTask, ServerState},
    24     protocol::{messages::HwServerMessage::Redirect, messages::*, ProtocolDecoder},
    24     protocol::{messages::HwServerMessage::Redirect, messages::*, ProtocolDecoder},
    25     utils,
    25     utils,
    26 };
    26 };
    27 
    27 
    28 #[cfg(feature = "official-server")]
    28 #[cfg(feature = "official-server")]
   315 
   315 
   316 struct TimerData(TimeoutEvent, ClientId);
   316 struct TimerData(TimeoutEvent, ClientId);
   317 
   317 
   318 pub struct NetworkLayer {
   318 pub struct NetworkLayer {
   319     listener: TcpListener,
   319     listener: TcpListener,
   320     server: HwServer,
   320     server_state: ServerState,
   321     clients: Slab<NetworkClient>,
   321     clients: Slab<NetworkClient>,
   322     pending: HashSet<(ClientId, NetworkClientState)>,
   322     pending: HashSet<(ClientId, NetworkClientState)>,
   323     pending_cache: Vec<(ClientId, NetworkClientState)>,
   323     pending_cache: Vec<(ClientId, NetworkClientState)>,
   324     #[cfg(feature = "tls-connections")]
   324     #[cfg(feature = "tls-connections")]
   325     ssl: ServerSsl,
   325     ssl: ServerSsl,
   423         if response.is_empty() {
   423         if response.is_empty() {
   424             return;
   424             return;
   425         }
   425         }
   426 
   426 
   427         debug!("{} pending server messages", response.len());
   427         debug!("{} pending server messages", response.len());
   428         let output = response.extract_messages(&mut self.server);
   428         let output = response.extract_messages(&mut self.server_state.server);
   429         for (clients, message) in output {
   429         for (clients, message) in output {
   430             debug!("Message {:?} to {:?}", message, clients);
   430             debug!("Message {:?} to {:?}", message, clients);
   431             let msg_string = message.to_raw_protocol();
   431             let msg_string = message.to_raw_protocol();
   432             for client_id in clients {
   432             for client_id in clients {
   433                 if let Some(client) = self.clients.get_mut(client_id) {
   433                 if let Some(client) = self.clients.get_mut(client_id) {
   523             response.add(Redirect(self.ssl.listener.local_addr().unwrap().port()).send_self())
   523             response.add(Redirect(self.ssl.listener.local_addr().unwrap().port()).send_self())
   524         }
   524         }
   525 
   525 
   526         if let IpAddr::V4(addr) = self.clients[client_id].peer_addr.ip() {
   526         if let IpAddr::V4(addr) = self.clients[client_id].peer_addr.ip() {
   527             handlers::handle_client_accept(
   527             handlers::handle_client_accept(
   528                 &mut self.server,
   528                 &mut self.server_state,
   529                 client_id,
   529                 client_id,
   530                 &mut response,
   530                 &mut response,
   531                 addr.octets(),
   531                 addr.octets(),
   532                 addr.is_loopback(),
   532                 addr.is_loopback(),
   533             );
   533             );
   592 
   592 
   593         match messages {
   593         match messages {
   594             Ok((messages, state)) => {
   594             Ok((messages, state)) => {
   595                 for message in messages {
   595                 for message in messages {
   596                     debug!("Handling message {:?} for client {}", message, client_id);
   596                     debug!("Handling message {:?} for client {}", message, client_id);
   597                     handlers::handle(&mut self.server, client_id, &mut response, message);
   597                     handlers::handle(&mut self.server_state, client_id, &mut response, message);
   598                 }
   598                 }
   599                 match state {
   599                 match state {
   600                     NetworkClientState::NeedsRead => {
   600                     NetworkClientState::NeedsRead => {
   601                         self.pending.insert((client_id, state));
   601                         self.pending.insert((client_id, state));
   602                     }
   602                     }
   647         let pending_close = self.clients[client_id].pending_close;
   647         let pending_close = self.clients[client_id].pending_close;
   648         self.deregister_client(poll, client_id, true);
   648         self.deregister_client(poll, client_id, true);
   649 
   649 
   650         if !pending_close {
   650         if !pending_close {
   651             let mut response = handlers::Response::new(client_id);
   651             let mut response = handlers::Response::new(client_id);
   652             handlers::handle_client_loss(&mut self.server, client_id, &mut response);
   652             handlers::handle_client_loss(&mut self.server_state, client_id, &mut response);
   653             self.handle_response(response, poll);
   653             self.handle_response(response, poll);
   654         }
   654         }
   655 
   655 
   656         Ok(())
   656         Ok(())
   657     }
   657     }
   728             context: builder.build(),
   728             context: builder.build(),
   729         }
   729         }
   730     }
   730     }
   731 
   731 
   732     pub fn build(self) -> NetworkLayer {
   732     pub fn build(self) -> NetworkLayer {
   733         let server = HwServer::new(self.clients_capacity, self.rooms_capacity);
   733         let server_state = ServerState::new(self.clients_capacity, self.rooms_capacity);
       
   734 
   734         let clients = Slab::with_capacity(self.clients_capacity);
   735         let clients = Slab::with_capacity(self.clients_capacity);
   735         let pending = HashSet::with_capacity(2 * self.clients_capacity);
   736         let pending = HashSet::with_capacity(2 * self.clients_capacity);
   736         let pending_cache = Vec::with_capacity(2 * self.clients_capacity);
   737         let pending_cache = Vec::with_capacity(2 * self.clients_capacity);
   737         let timer = timer::Builder::default().build();
   738         let timer = timer::Builder::default().build();
   738 
   739 
   739         NetworkLayer {
   740         NetworkLayer {
   740             listener: self.listener.expect("No listener provided"),
   741             listener: self.listener.expect("No listener provided"),
   741             server,
   742             server_state,
   742             clients,
   743             clients,
   743             pending,
   744             pending,
   744             pending_cache,
   745             pending_cache,
   745             #[cfg(feature = "tls-connections")]
   746             #[cfg(feature = "tls-connections")]
   746             ssl: Self::create_ssl_context(
   747             ssl: Self::create_ssl_context(