diff --git a/.gitignore b/.gitignore index d01bd1a..78192d7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,9 @@ Cargo.lock # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ \ No newline at end of file +#.idea/ + +# Added by cargo + +/target +received_file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..412079d --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rust_share" # Modifica il nome del crate in snake case +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/received/README.md b/received/README.md new file mode 100644 index 0000000..ae015aa --- /dev/null +++ b/received/README.md @@ -0,0 +1,2 @@ +# RustShare +A system to share files between devices in the same network diff --git a/src/common.rs b/src/common.rs new file mode 100644 index 0000000..d3f34f1 --- /dev/null +++ b/src/common.rs @@ -0,0 +1 @@ +pub const PORT: u16 = 7878; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..18cca01 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,21 @@ +use std::env; +use std::io; +mod sender; +mod receiver; +mod common; + +fn print_usage() { + println!("Usage:"); + println!(" send
- Send a file to the specified address"); + println!(" receive - Receive files on the specified port"); +} + +fn main() -> io::Result<()> { + let args: Vec = env::args().collect(); + if args.len() == 4 && args[1] == "send" { + sender::send_file(&args[2], &args[3])?; + } else { + receiver::receive_file()?; + } + Ok(()) +} diff --git a/src/receiver.rs b/src/receiver.rs new file mode 100644 index 0000000..3ada5ac --- /dev/null +++ b/src/receiver.rs @@ -0,0 +1,47 @@ +use std::{fs::{self, File}, io::{self, BufRead, BufReader, Read, Write}, net::{TcpListener, TcpStream}, thread}; +use crate::common::PORT; + +fn handle_client(mut stream: TcpStream) -> io::Result<()> { + println!("Connection received"); + + // Read the file name + let mut reader = BufReader::new(&mut stream); + let mut file_name = String::new(); + reader.read_line(&mut file_name)?; + let file_name = file_name.trim(); + + // Create the "received" directory if it doesn't exist + fs::create_dir_all("received")?; + + let file_path = format!("received/{}", file_name); + let mut file = File::create(file_path)?; + let mut buffer = [0; 1024]; + + while let Ok(n) = reader.read(&mut buffer) { + if n == 0 { + break; + } + file.write_all(&buffer[..n])?; + } + println!("File received and saved as 'received/{}'", file_name); + Ok(()) +} + +pub fn receive_file() -> io::Result<()> { + let listener = TcpListener::bind(format!("0.0.0.0:{}", PORT))?; + println!("Listening on port {}", PORT); + + for stream in listener.incoming() { + match stream { + Ok(stream) => { + thread::spawn(move || { + if let Err(e) = handle_client(stream) { + eprintln!("Error handling client: {}", e); + } + }); + }, + Err(e) => eprintln!("Connection error: {}", e), + } + } + Ok(()) +} diff --git a/src/sender.rs b/src/sender.rs new file mode 100644 index 0000000..112de9c --- /dev/null +++ b/src/sender.rs @@ -0,0 +1,28 @@ +use std::{fs::File, io::{self, Read, Write}, net::{TcpStream, Shutdown}, path::Path}; + +pub fn send_file(addr: &str, file_path: &str) -> io::Result<()> { + let mut stream = TcpStream::connect(addr)?; + let mut file = File::open(file_path)?; + let mut buffer = [0; 1024]; + + // Get the file name from the file_path + let file_name = Path::new(file_path) + .file_name() + .and_then(|name| name.to_str()) + .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, "Invalid file name"))?; + + // Send the file name + stream.write_all(file_name.as_bytes())?; + stream.write_all(b"\n")?; + + while let Ok(n) = file.read(&mut buffer) { + if n == 0 { + break; + } + stream.write_all(&buffer[..n])?; + } + + stream.shutdown(Shutdown::Write)?; + println!("File successfully sent to {}", addr); + Ok(()) +}