diff options
Diffstat (limited to 'src/server/mod.rs')
| -rw-r--r-- | src/server/mod.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs new file mode 100644 index 0000000..9b55502 --- /dev/null +++ b/src/server/mod.rs @@ -0,0 +1,48 @@ +//! Contains the necessary ingredients to start a graf karto world server. + +use crate::net::server::ConnectionManager; +use crate::net::Cargo; +use std::io; +use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr}; +use std::thread::{self, JoinHandle}; + +/// The default port the dedicated graf karto server runs on. +pub const DEFAULT_PORT: u16 = 44309; + +fn localhost(port: u16, ipv4: bool) -> SocketAddr { + if ipv4 { + SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port) + } else { + SocketAddr::new(Ipv6Addr::LOCALHOST.into(), port) + } +} + +/// Starts a thread for the server and tries to bind to the specified port. If the +/// port cannot be bound to it fails returning an error, otherwise the join handle +/// for the server thread is returned. +pub fn start_with_port(port: u16, ipv4: bool) -> Result<JoinHandle<()>, io::Error> { + let addr = localhost(port, ipv4); + let conn_man = ConnectionManager::start(addr)?; + + Ok(start(conn_man)) +} + +/// Starts a thread on any free system port. Returns an error in case that's not +/// possible. +pub fn start_any_port(ipv4: bool) -> Result<(JoinHandle<()>, u16), io::Error> { + let addr = localhost(0, ipv4); + + let conn_man = ConnectionManager::start(addr)?; + let port = conn_man.port(); + + Ok((start(conn_man), port)) +} + +fn start(conn_man: ConnectionManager<Cargo>) -> JoinHandle<()> { + info!("Server started on port {}", conn_man.port()); + thread::spawn(move || loop { + if let Some(cargo) = conn_man.next_packet() { + println!("Received cargo: {:?}", cargo); + } + }) +} |
