rust/hedgewars-server/src/main.rs
changeset 15800 6af892a0a4b8
parent 15795 40929af15167
child 15831 7d0f747afcb8
equal deleted inserted replaced
15799:ed3b510b860c 15800:6af892a0a4b8
     2 #![deny(bare_trait_objects)]
     2 #![deny(bare_trait_objects)]
     3 
     3 
     4 use getopts::Options;
     4 use getopts::Options;
     5 use log::*;
     5 use log::*;
     6 use mio::{net::*, *};
     6 use mio::{net::*, *};
     7 use std::{env, str::FromStr as _, time::Duration};
     7 use std::{
       
     8     env,
       
     9     str::FromStr as _,
       
    10     time::{Duration, Instant},
       
    11 };
     8 
    12 
     9 mod core;
    13 mod core;
    10 mod handlers;
    14 mod handlers;
    11 mod protocol;
    15 mod protocol;
    12 mod server;
    16 mod server;
    42         .opt_str("p")
    46         .opt_str("p")
    43         .and_then(|s| u16::from_str(&s).ok())
    47         .and_then(|s| u16::from_str(&s).ok())
    44         .unwrap_or(46631);
    48         .unwrap_or(46631);
    45     let address = format!("0.0.0.0:{}", port).parse().unwrap();
    49     let address = format!("0.0.0.0:{}", port).parse().unwrap();
    46 
    50 
    47     let listener = TcpListener::bind(&address).unwrap();
    51     let listener = TcpListener::bind(address).unwrap();
    48 
    52 
    49     let poll = Poll::new().unwrap();
    53     let mut poll = Poll::new().unwrap();
    50     let mut hw_builder = NetworkLayerBuilder::default().with_listener(listener);
    54     let mut hw_builder = NetworkLayerBuilder::default().with_listener(listener);
    51 
    55 
    52     #[cfg(feature = "tls-connections")]
    56     #[cfg(feature = "tls-connections")]
    53     {
    57     {
    54         let address = format!("0.0.0.0:{}", port + 1).parse().unwrap();
    58         let address = format!("0.0.0.0:{}", port + 1).parse().unwrap();
    55         hw_builder = hw_builder.with_secure_listener(TcpListener::bind(&address).unwrap());
    59         hw_builder = hw_builder.with_secure_listener(TcpListener::bind(address).unwrap());
    56     }
    60     }
    57 
    61 
    58     let mut hw_network = hw_builder.build();
    62     let mut hw_network = hw_builder.build(&poll);
    59     hw_network.register(&poll).unwrap();
    63     hw_network.register(&poll).unwrap();
    60 
    64 
    61     let mut events = Events::with_capacity(1024);
    65     let mut events = Events::with_capacity(1024);
       
    66 
       
    67     let mut time = Instant::now();
    62 
    68 
    63     loop {
    69     loop {
    64         let timeout = if hw_network.has_pending_operations() {
    70         let timeout = if hw_network.has_pending_operations() {
    65             Some(Duration::from_millis(1))
    71             Some(Duration::from_millis(1))
    66         } else {
    72         } else {
    67             None
    73             None
    68         };
    74         };
       
    75 
    69         poll.poll(&mut events, timeout).unwrap();
    76         poll.poll(&mut events, timeout).unwrap();
    70 
    77 
    71         for event in events.iter() {
    78         for event in events.iter() {
    72             if event.readiness() & Ready::readable() == Ready::readable() {
    79             if event.is_readable() {
    73                 match event.token() {
    80                 match event.token() {
    74                     token @ (utils::SERVER_TOKEN | utils::SECURE_SERVER_TOKEN) => {
    81                     token @ (utils::SERVER_TOKEN | utils::SECURE_SERVER_TOKEN) => {
    75                         match hw_network.accept_client(&poll, token) {
    82                         match hw_network.accept_client(&poll, token) {
    76                             Ok(()) => (),
    83                             Ok(()) => (),
    77                             Err(e) => debug!("Error accepting client: {}", e),
    84                             Err(e) => debug!("Error accepting client: {}", e),
    78                         }
    85                         }
    79                     }
    86                     }
    80                     utils::TIMER_TOKEN => match hw_network.handle_timeout(&poll) {
       
    81                         Ok(()) => (),
       
    82                         Err(e) => debug!("Error in timer event: {}", e),
       
    83                     },
       
    84                     #[cfg(feature = "official-server")]
    87                     #[cfg(feature = "official-server")]
    85                     utils::IO_TOKEN => match hw_network.handle_io_result(&poll) {
    88                     utils::IO_TOKEN => match hw_network.handle_io_result(&poll) {
    86                         Ok(()) => (),
    89                         Ok(()) => (),
    87                         Err(e) => debug!("Error in IO task: {}", e),
    90                         Err(e) => debug!("Error in IO task: {}", e),
    88                     },
    91                     },
    90                         Ok(()) => (),
    93                         Ok(()) => (),
    91                         Err(e) => debug!("Error reading from client socket {}: {}", token, e),
    94                         Err(e) => debug!("Error reading from client socket {}: {}", token, e),
    92                     },
    95                     },
    93                 }
    96                 }
    94             }
    97             }
    95             if event.readiness() & Ready::writable() == Ready::writable() {
    98             if event.is_writable() {
    96                 match event.token() {
    99                 match event.token() {
    97                     utils::SERVER_TOKEN
   100                     utils::SERVER_TOKEN | utils::SECURE_SERVER_TOKEN | utils::IO_TOKEN => {
    98                     | utils::SECURE_SERVER_TOKEN
   101                         unreachable!()
    99                     | utils::TIMER_TOKEN
   102                     }
   100                     | utils::IO_TOKEN => unreachable!(),
       
   101                     Token(token) => match hw_network.client_writable(&poll, token) {
   103                     Token(token) => match hw_network.client_writable(&poll, token) {
   102                         Ok(()) => (),
   104                         Ok(()) => (),
   103                         Err(e) => debug!("Error writing to client socket {}: {}", token, e),
   105                         Err(e) => debug!("Error writing to client socket {}: {}", token, e),
   104                     },
   106                     },
   105                 }
   107                 }
   108 
   110 
   109         match hw_network.on_idle(&poll) {
   111         match hw_network.on_idle(&poll) {
   110             Ok(()) => (),
   112             Ok(()) => (),
   111             Err(e) => debug!("Error in idle handler: {}", e),
   113             Err(e) => debug!("Error in idle handler: {}", e),
   112         };
   114         };
       
   115 
       
   116         if time.elapsed() > Duration::from_secs(1) {
       
   117             time = Instant::now();
       
   118             match hw_network.handle_timeout(&mut poll) {
       
   119                 Ok(()) => (),
       
   120                 Err(e) => debug!("Error in timer event: {}", e),
       
   121             }
       
   122         }
   113     }
   123     }
   114 }
   124 }