diff --git a/udp/README.md b/udp/README.md new file mode 100644 index 0000000..8917e5d --- /dev/null +++ b/udp/README.md @@ -0,0 +1,5 @@ + +from: +https://riptutorial.com/rust/example/4404/a-simple-tcp-client-and-server-application--echo + + diff --git a/udp/udp_client/Cargo.lock b/udp/udp_client/Cargo.lock new file mode 100644 index 0000000..db069c9 --- /dev/null +++ b/udp/udp_client/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "udp_client" +version = "0.1.0" diff --git a/udp/udp_client/Cargo.toml b/udp/udp_client/Cargo.toml new file mode 100644 index 0000000..c46d6f0 --- /dev/null +++ b/udp/udp_client/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "udp_client" +version = "0.1.0" +authors = ["Hatter Jiang "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/udp/udp_client/src/main.rs b/udp/udp_client/src/main.rs new file mode 100644 index 0000000..55149d1 --- /dev/null +++ b/udp/udp_client/src/main.rs @@ -0,0 +1,34 @@ +use std::net::{TcpStream}; +use std::io::{Read, Write}; +use std::str::from_utf8; + +fn main() { + match TcpStream::connect("localhost:3333") { + Ok(mut stream) => { + println!("Successfully connected to server in port 3333"); + + let msg = b"Hello!"; + stream.write(msg).unwrap(); + println!("Sent Hello, awaiting reply..."); + + let mut data = [0 as u8; 6]; // using 6 byte buffer + match stream.read_exact(&mut data) { + Ok(_) => { + if &data == msg { + println!("Reply is ok!"); + } else { + let text = from_utf8(&data).unwrap(); + println!("Unexpected reply: {}", text); + } + }, + Err(e) => { + println!("Failed to receive data: {}", e); + } + } + }, + Err(e) => { + println!("Failed to connect: {}", e); + } + } + println!("Terminated."); +} \ No newline at end of file diff --git a/udp/udp_server/Cargo.lock b/udp/udp_server/Cargo.lock new file mode 100644 index 0000000..8de3e30 --- /dev/null +++ b/udp/udp_server/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "udp_server" +version = "0.1.0" diff --git a/udp/udp_server/Cargo.toml b/udp/udp_server/Cargo.toml new file mode 100644 index 0000000..8cdde67 --- /dev/null +++ b/udp/udp_server/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "udp_server" +version = "0.1.0" +authors = ["Hatter Jiang "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/udp/udp_server/src/main.rs b/udp/udp_server/src/main.rs new file mode 100644 index 0000000..b9c5b32 --- /dev/null +++ b/udp/udp_server/src/main.rs @@ -0,0 +1,42 @@ +use std::thread; +use std::net::{ TcpListener, TcpStream, Shutdown }; +use std::io::{ Read, Write }; + +fn handle_client(mut stream: TcpStream) { + let mut data = [0_u8; 50]; // using 50 byte buffer + while match stream.read(&mut data) { + Ok(size) => { + // echo everything! + stream.write(&data[0..size]).unwrap(); + true + }, + Err(_) => { + println!("An error occurred, terminating connection with {}", stream.peer_addr().unwrap()); + stream.shutdown(Shutdown::Both).unwrap(); + false + }, + } {} +} + +fn main() { + let listener = TcpListener::bind("0.0.0.0:3333").unwrap(); + // accept connections and process them, spawning a new thread for each one + println!("Server listening on port 3333"); + for stream in listener.incoming() { + match stream { + Ok(stream) => { + println!("New connection: {}", stream.peer_addr().unwrap()); + thread::spawn(move|| { + // connection succeeded + handle_client(stream) + }); + }, + Err(e) => { + println!("Error: {}", e); + /* connection failed */ + }, + } + } + // close the socket server + drop(listener); +} \ No newline at end of file