rust/hedgewars-server/src/main.rs
changeset 15831 7d0f747afcb8
parent 15800 6af892a0a4b8
child 15938 ce47259d5c86
equal deleted inserted replaced
15830:ea459da15b30 15831:7d0f747afcb8
       
     1 #![forbid(unsafe_code)]
     1 #![allow(unused_imports)]
     2 #![allow(unused_imports)]
       
     3 #![allow(dead_code)]
       
     4 #![allow(unused_variables)]
     2 #![deny(bare_trait_objects)]
     5 #![deny(bare_trait_objects)]
     3 
     6 
     4 use getopts::Options;
     7 use getopts::Options;
     5 use log::*;
     8 use log::*;
     6 use mio::{net::*, *};
     9 use std::{env, net::SocketAddr, str::FromStr as _};
     7 use std::{
       
     8     env,
       
     9     str::FromStr as _,
       
    10     time::{Duration, Instant},
       
    11 };
       
    12 
    10 
    13 mod core;
    11 mod core;
    14 mod handlers;
    12 mod handlers;
    15 mod protocol;
    13 mod protocol;
    16 mod server;
    14 mod server;
    18 
    16 
    19 use crate::server::network::{NetworkLayer, NetworkLayerBuilder};
    17 use crate::server::network::{NetworkLayer, NetworkLayerBuilder};
    20 
    18 
    21 const PROGRAM_NAME: &'_ str = "Hedgewars Game Server";
    19 const PROGRAM_NAME: &'_ str = "Hedgewars Game Server";
    22 
    20 
    23 fn main() {
    21 #[tokio::main]
       
    22 async fn main() -> tokio::io::Result<()> {
    24     env_logger::init();
    23     env_logger::init();
    25 
    24 
    26     info!("Hedgewars game server, protocol {}", utils::SERVER_VERSION);
    25     info!("Hedgewars game server, protocol {}", utils::SERVER_VERSION);
    27 
    26 
    28     let args: Vec<String> = env::args().collect();
    27     let args: Vec<String> = env::args().collect();
    32     opts.optflag("h", "help", "help");
    31     opts.optflag("h", "help", "help");
    33     let matches = match opts.parse(&args[1..]) {
    32     let matches = match opts.parse(&args[1..]) {
    34         Ok(m) => m,
    33         Ok(m) => m,
    35         Err(e) => {
    34         Err(e) => {
    36             println!("{}\n{}", e, opts.short_usage(""));
    35             println!("{}\n{}", e, opts.short_usage(""));
    37             return;
    36             return Ok(());
    38         }
    37         }
    39     };
    38     };
    40     if matches.opt_present("h") {
    39     if matches.opt_present("h") {
    41         println!("{}", opts.usage(PROGRAM_NAME));
    40         println!("{}", opts.usage(PROGRAM_NAME));
    42         return;
    41         return Ok(());
    43     }
    42     }
    44 
    43 
    45     let port = matches
    44     let port = matches
    46         .opt_str("p")
    45         .opt_str("p")
    47         .and_then(|s| u16::from_str(&s).ok())
    46         .and_then(|s| u16::from_str(&s).ok())
    48         .unwrap_or(46631);
    47         .unwrap_or(46631);
    49     let address = format!("0.0.0.0:{}", port).parse().unwrap();
    48     let address: SocketAddr = format!("0.0.0.0:{}", port).parse().unwrap();
    50 
    49 
    51     let listener = TcpListener::bind(address).unwrap();
    50     let server = tokio::net::TcpListener::bind(address).await.unwrap();
    52 
    51 
    53     let mut poll = Poll::new().unwrap();
    52     let mut hw_network = NetworkLayerBuilder::default().with_listener(server).build();
    54     let mut hw_builder = NetworkLayerBuilder::default().with_listener(listener);
       
    55 
    53 
    56     #[cfg(feature = "tls-connections")]
    54     hw_network.run().await;
    57     {
    55     Ok(())
    58         let address = format!("0.0.0.0:{}", port + 1).parse().unwrap();
       
    59         hw_builder = hw_builder.with_secure_listener(TcpListener::bind(address).unwrap());
       
    60     }
       
    61 
       
    62     let mut hw_network = hw_builder.build(&poll);
       
    63     hw_network.register(&poll).unwrap();
       
    64 
       
    65     let mut events = Events::with_capacity(1024);
       
    66 
       
    67     let mut time = Instant::now();
       
    68 
       
    69     loop {
       
    70         let timeout = if hw_network.has_pending_operations() {
       
    71             Some(Duration::from_millis(1))
       
    72         } else {
       
    73             None
       
    74         };
       
    75 
       
    76         poll.poll(&mut events, timeout).unwrap();
       
    77 
       
    78         for event in events.iter() {
       
    79             if event.is_readable() {
       
    80                 match event.token() {
       
    81                     token @ (utils::SERVER_TOKEN | utils::SECURE_SERVER_TOKEN) => {
       
    82                         match hw_network.accept_client(&poll, token) {
       
    83                             Ok(()) => (),
       
    84                             Err(e) => debug!("Error accepting client: {}", e),
       
    85                         }
       
    86                     }
       
    87                     #[cfg(feature = "official-server")]
       
    88                     utils::IO_TOKEN => match hw_network.handle_io_result(&poll) {
       
    89                         Ok(()) => (),
       
    90                         Err(e) => debug!("Error in IO task: {}", e),
       
    91                     },
       
    92                     Token(token) => match hw_network.client_readable(&poll, token) {
       
    93                         Ok(()) => (),
       
    94                         Err(e) => debug!("Error reading from client socket {}: {}", token, e),
       
    95                     },
       
    96                 }
       
    97             }
       
    98             if event.is_writable() {
       
    99                 match event.token() {
       
   100                     utils::SERVER_TOKEN | utils::SECURE_SERVER_TOKEN | utils::IO_TOKEN => {
       
   101                         unreachable!()
       
   102                     }
       
   103                     Token(token) => match hw_network.client_writable(&poll, token) {
       
   104                         Ok(()) => (),
       
   105                         Err(e) => debug!("Error writing to client socket {}: {}", token, e),
       
   106                     },
       
   107                 }
       
   108             }
       
   109         }
       
   110 
       
   111         match hw_network.on_idle(&poll) {
       
   112             Ok(()) => (),
       
   113             Err(e) => debug!("Error in idle handler: {}", e),
       
   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         }
       
   123     }
       
   124 }
    56 }