mod client_manager;
pub use client_manager::ClientManager;
mod client;
pub use client::Client;
use std::sync::Arc;
use tokio::net::TcpListener;
pub struct TCPForwarder {
user_port: u16,
listener: TcpListener,
clients: Arc<ClientManager>,
}
impl TCPForwarder {
pub async fn new(port: u16, clients: Arc<ClientManager>) -> Result<Self, std::io::Error> {
let bind_addr = format!("0.0.0.0:{}", port);
let listener = TcpListener::bind(&bind_addr).await?;
Ok(Self {
user_port: port,
listener,
clients,
})
}
pub async fn start(self) -> ! {
info!("Listening for Users on Port: {}", self.user_port);
let mut id: u32 = 0;
loop {
let user_socket = match self.listener.accept().await {
Ok((raw_socket, _)) => raw_socket,
Err(e) => {
error!("[{}] Accepting Req-Connection: {}", self.user_port, e);
continue;
}
};
let client = match self.clients.get() {
Some(c) => c,
None => {
error!("[{}] Could not obtain a Client-Connection", self.user_port);
continue;
}
};
id = id.wrapping_add(1);
client.new_con(id, user_socket);
}
}
}