From ec2b476446b6660afb1f3d8b8532041a90ac89e3 Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 29 Nov 2024 08:19:23 +0100 Subject: [PATCH] Server Rewrite --- Cargo.lock | 123 +--------------------------------------------------- Cargo.toml | 3 +- src/main.rs | 114 +++++++++++++++++++++++++++--------------------- 3 files changed, 66 insertions(+), 174 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1c499f3..80bbb41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -121,7 +121,6 @@ dependencies = [ "colog", "log", "tokio", - "x25519-dalek", ] [[package]] @@ -151,41 +150,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "cpufeatures" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" -dependencies = [ - "libc", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "env_filter" version = "0.1.2" @@ -209,12 +173,6 @@ dependencies = [ "log", ] -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - [[package]] name = "gimli" version = "0.31.1" @@ -350,12 +308,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" - [[package]] name = "redox_syscall" version = "0.5.7" @@ -400,47 +352,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "serde" -version = "1.0.215" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.215" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -466,12 +383,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "syn" version = "2.0.89" @@ -677,35 +588,3 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek", - "rand_core", - "serde", - "zeroize", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index 23c1b03..6ede4c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,5 +6,4 @@ edition = "2021" [dependencies] colog = "1.3.0" log = "0.4.22" -tokio = { version = "1.41.1", features = ["full"] } -x25519-dalek = "2.0.1" +tokio = { version = "1.41.1", features = ["full"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 1916a7d..01b7729 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,56 +1,70 @@ -use log::{debug, error, info, trace, warn}; -use std::env::args; -use std::net::{TcpListener, TcpStream}; - -#[derive(Debug)] -struct Settings { - host: String, - port: String, -} - -impl Settings { - fn new(args: &[String]) -> Result { - if args.len() < 4 { - return Err("not enough arguments"); - } - - let port = args[2].clone(); - let host = args[4].clone(); - - Ok(Settings { host, port }) - } - - fn get_full_host(&self) -> String { - format!("{}:{}", self.host, self.port) - } -} - -async fn handle_client(mut stream: TcpStream) { - info!("Connected to {}", stream.peer_addr().unwrap()); - stream.set_nodelay(true).unwrap(); - - loop { - - } -} +// main.rs +use colog; +use log::info; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; +use tokio::net::{TcpListener, TcpStream}; +use tokio::sync::broadcast; #[tokio::main] async fn main() { + // Initialize the logger colog::init(); - info!("Starting..."); - let args: Vec = args().collect(); - let settings = Settings::new(&args).unwrap(); - info!("Server Address: {}:{}", settings.host, settings.port); - info!("Starting to listen to connections..."); - let listener = TcpListener::bind(Settings::get_full_host(&settings)).unwrap(); - match listener.accept() { - Ok((socket, _)) => { - tokio::spawn(async move { - handle_client(socket).await; - }); - } - Err(e) => { - error!("Something went wrong {}", e); - } + + // Bind a TCP listener to accept incoming connections + let listener = TcpListener::bind("0.0.0.0:8080").await.unwrap(); + info!("Server running on port 8080"); + + // Create a broadcast channel for sharing messages + let (tx, _) = broadcast::channel(100); + + loop { + // Accept a new client + let (socket, addr) = listener.accept().await.unwrap(); + info!("Client connected: {}", addr); + + let tx = tx.clone(); + let rx = tx.subscribe(); + + // Handle the client in a new task + tokio::spawn(async move { + handle_client(socket, tx, rx).await; + }); } } + +async fn handle_client( + socket: TcpStream, + tx: broadcast::Sender, + mut rx: broadcast::Receiver, +) { + let (reader, mut writer) = socket.into_split(); + let mut reader = BufReader::new(reader); + let mut line = String::new(); + + // Task for reading messages from the client + let mut read_task = tokio::spawn(async move { + loop { + line.clear(); + let bytes_read = reader.read_line(&mut line).await.unwrap(); + if bytes_read == 0 { + break; + } + tx.send(line.clone()).unwrap(); + } + }); + + // Task for sending messages to the client + let mut write_task = tokio::spawn(async move { + while let Ok(msg) = rx.recv().await { + writer.write_all(msg.as_bytes()).await.unwrap(); + } + }); + + // Wait for both tasks to complete + tokio::select! { + _ = &mut read_task => (), + _ = &mut write_task => (), + } + + info!("Client disconnected"); +}