feat: add udp
This commit is contained in:
5
udp/README.md
Normal file
5
udp/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
|
||||
from:
|
||||
https://riptutorial.com/rust/example/4404/a-simple-tcp-client-and-server-application--echo
|
||||
|
||||
|
||||
5
udp/udp_client/Cargo.lock
generated
Normal file
5
udp/udp_client/Cargo.lock
generated
Normal file
@@ -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"
|
||||
9
udp/udp_client/Cargo.toml
Normal file
9
udp/udp_client/Cargo.toml
Normal file
@@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "udp_client"
|
||||
version = "0.1.0"
|
||||
authors = ["Hatter Jiang <jht5945@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
34
udp/udp_client/src/main.rs
Normal file
34
udp/udp_client/src/main.rs
Normal file
@@ -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.");
|
||||
}
|
||||
5
udp/udp_server/Cargo.lock
generated
Normal file
5
udp/udp_server/Cargo.lock
generated
Normal file
@@ -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"
|
||||
9
udp/udp_server/Cargo.toml
Normal file
9
udp/udp_server/Cargo.toml
Normal file
@@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "udp_server"
|
||||
version = "0.1.0"
|
||||
authors = ["Hatter Jiang <jht5945@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
42
udp/udp_server/src/main.rs
Normal file
42
udp/udp_server/src/main.rs
Normal file
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user