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(())
+}