diff -r f56936207a65 -r 8ddb5842fe0b rust/hedgewars-server/src/main.rs --- a/rust/hedgewars-server/src/main.rs Tue Apr 23 15:54:06 2019 +0200 +++ b/rust/hedgewars-server/src/main.rs Wed Apr 24 16:21:46 2019 +0300 @@ -1,25 +1,24 @@ #![allow(unused_imports)] #![deny(bare_trait_objects)] -extern crate getopts; use getopts::Options; use log::*; -use mio::net::*; -use mio::*; -use std::env; +use mio::{net::*, *}; +use std::{env, str::FromStr as _, time::Duration}; mod protocol; mod server; mod utils; -use crate::server::network::NetworkLayer; -use std::time::Duration; +use crate::server::network::{NetworkLayer, NetworkLayerBuilder}; const PROGRAM_NAME: &'_ str = "Hedgewars Game Server"; fn main() { env_logger::init(); + info!("Hedgewars game server, protocol {}", utils::SERVER_VERSION); + let args: Vec = env::args().collect(); let mut opts = Options::new(); @@ -36,23 +35,26 @@ println!("{}", opts.usage(PROGRAM_NAME)); return; } - info!("Hedgewars game server, protocol {}", utils::SERVER_VERSION); - let address; - if matches.opt_present("p") { - match matches.opt_str("p") { - Some(x) => address = format!("0.0.0.0:{}", x).parse().unwrap(), - None => address = "0.0.0.0:46631".parse().unwrap(), - } - } else { - address = "0.0.0.0:46631".parse().unwrap(); - } + let port = matches + .opt_str("p") + .and_then(|s| u16::from_str(&s).ok()) + .unwrap_or(46631); + let address = format!("0.0.0.0:{}", port).parse().unwrap(); let listener = TcpListener::bind(&address).unwrap(); let poll = Poll::new().unwrap(); - let mut hw_network = NetworkLayer::new(listener, 1024, 512); - hw_network.register_server(&poll).unwrap(); + let mut hw_builder = NetworkLayerBuilder::default().with_listener(listener); + + #[cfg(feature = "tls-connections")] + { + let address = format!("0.0.0.0:{}", port + 1).parse().unwrap(); + hw_builder = hw_builder.with_secure_listener(TcpListener::bind(&address).unwrap()); + } + + let mut hw_network = hw_builder.build(); + hw_network.register(&poll).unwrap(); let mut events = Events::with_capacity(1024); @@ -67,7 +69,9 @@ for event in events.iter() { if event.readiness() & Ready::readable() == Ready::readable() { match event.token() { - utils::SERVER_TOKEN => hw_network.accept_client(&poll).unwrap(), + token @ utils::SERVER_TOKEN | token @ utils::SECURE_SERVER_TOKEN => { + hw_network.accept_client(&poll, token).unwrap() + } utils::TIMER_TOKEN => hw_network.handle_timeout(&poll).unwrap(), #[cfg(feature = "official-server")] utils::IO_TOKEN => hw_network.handle_io_result(),