make address/port to listen on configurable

This commit is contained in:
soruh 2023-02-15 13:48:41 +01:00
parent 91eebb2c5d
commit 7cf6b4e38e
2 changed files with 13 additions and 9 deletions

View File

@ -1,5 +1,6 @@
{ {
"dyn_ip_server": "127.0.0.1:11811", "dyn_ip_server": "127.0.0.1:11811",
"listen_addr": "0.0.0.0:11812",
"allowed_ports": [ "allowed_ports": [
[ [
3000, 3000,

View File

@ -34,8 +34,6 @@ const PORT_OWNERSHIP_TIMEOUT: Duration = Duration::from_secs(1 * 60 * 60);
const PING_TIMEOUT: Duration = Duration::from_secs(30); const PING_TIMEOUT: Duration = Duration::from_secs(30);
const SEND_PING_INTERVAL: Duration = Duration::from_secs(20); const SEND_PING_INTERVAL: Duration = Duration::from_secs(20);
const BIND_IP: &str = "0.0.0.0";
mod packets; mod packets;
type Port = u16; type Port = u16;
@ -46,6 +44,8 @@ type UnixTimestamp = u64;
struct Config { struct Config {
allowed_ports: AllowedPorts, allowed_ports: AllowedPorts,
#[serde(deserialize_with = "parse_socket_addr")] #[serde(deserialize_with = "parse_socket_addr")]
listen_addr: SocketAddr,
#[serde(deserialize_with = "parse_socket_addr")]
dyn_ip_server: SocketAddr, dyn_ip_server: SocketAddr,
} }
@ -261,7 +261,7 @@ impl PortGuard {
} }
impl PortHandler { impl PortHandler {
fn allocate_port_for_number(&mut self, number: Number) -> Option<Port> { fn allocate_port_for_number(&mut self, config: &Config, number: Number) -> Option<Port> {
if let Some(port) = self.allocated_ports.get(&number) { if let Some(port) = self.allocated_ports.get(&number) {
let already_connected = self let already_connected = self
.port_state .port_state
@ -277,14 +277,14 @@ impl PortHandler {
self.free_ports.remove(&port); self.free_ports.remove(&port);
port port
} else { } else {
self.try_recover_port()? self.try_recover_port(config)?
}; };
assert!(self.allocated_ports.insert(number, port).is_none()); assert!(self.allocated_ports.insert(number, port).is_none());
Some(port) Some(port)
} }
fn try_recover_port(&mut self) -> Option<Port> { fn try_recover_port(&mut self, config: &Config) -> Option<Port> {
let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
let mut recovered_port = None; let mut recovered_port = None;
@ -301,7 +301,7 @@ impl PortHandler {
.saturating_sub(Duration::from_secs(timestamp)) .saturating_sub(Duration::from_secs(timestamp))
); );
match std::net::TcpListener::bind((BIND_IP, port)) { match std::net::TcpListener::bind((config.listen_addr.ip(), port)) {
Ok(_) => { Ok(_) => {
recovered_port = Some((timestamp, port)); recovered_port = Some((timestamp, port));
return None; return None;
@ -398,7 +398,10 @@ async fn connection_handler(
let port = loop { let port = loop {
let mut updated_server = false; let mut updated_server = false;
let port = port_handler.lock().await.allocate_port_for_number(number); let port = port_handler
.lock()
.await
.allocate_port_for_number(config, number);
println!("allocated port: {:?}", port); println!("allocated port: {:?}", port);
@ -421,7 +424,7 @@ async fn connection_handler(
let listener = if let Some((listener, _package)) = port_handler.stop_rejector(port).await { let listener = if let Some((listener, _package)) = port_handler.stop_rejector(port).await {
Ok(listener) Ok(listener)
} else { } else {
TcpListener::bind((BIND_IP, port)).await TcpListener::bind((config.listen_addr.ip(), port)).await
}; };
match listener { match listener {
@ -683,7 +686,7 @@ async fn main() -> anyhow::Result<()> {
}); });
} }
let listener = TcpListener::bind(("0.0.0.0", 11820)).await?; let listener = TcpListener::bind(config.listen_addr).await?;
while let Ok((mut stream, addr)) = listener.accept().await { while let Ok((mut stream, addr)) = listener.accept().await {
println!("connection from {addr}"); println!("connection from {addr}");