feat: ✨ udp hole puncher
This commit is contained in:
parent
c1eb13aa0a
commit
20750ec058
3 changed files with 116 additions and 1 deletions
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -18,4 +18,8 @@ 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/
|
||||
#.idea/
|
||||
|
||||
# Added by cargo
|
||||
|
||||
/target
|
||||
|
|
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "rust-udp-hole-puncher"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
105
src/main.rs
Normal file
105
src/main.rs
Normal file
|
@ -0,0 +1,105 @@
|
|||
use std::{io, net::UdpSocket};
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
println!("Addr");
|
||||
let mut addr = String::default();
|
||||
io::stdin().read_line(&mut addr).unwrap();
|
||||
let addr = addr.trim_end();
|
||||
println!("Server | Client");
|
||||
let mut input = String::default();
|
||||
io::stdin().read_line(&mut input).unwrap();
|
||||
let input = input.trim_end();
|
||||
match input {
|
||||
"server" | "Server" | "SERVER" | "s" => server(addr),
|
||||
"client" | "Client" | "CLIENT" | "c" => client(addr),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
fn server(addr: &str) {
|
||||
let udp_socket = match UdpSocket::bind(addr) {
|
||||
Ok(udp_socket) => udp_socket,
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
return;
|
||||
}
|
||||
};
|
||||
let mut buffer = [0_u8; 100];
|
||||
let mut peers = vec![];
|
||||
for _ in 0..2 {
|
||||
let (data_size, peer) = match udp_socket.recv_from(&mut buffer) {
|
||||
Ok((data_size, peer)) => (data_size, peer),
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
return;
|
||||
}
|
||||
};
|
||||
peers.push(format!("{}:{}", peer.ip(), peer.port()));
|
||||
let data = buffer.split_at(data_size).0;
|
||||
let message = String::from_utf8_lossy(data).into_owned();
|
||||
println!("{}:{} = {}", peer.ip(), peer.port(), message);
|
||||
}
|
||||
|
||||
match udp_socket.send_to(peers[1].as_bytes(), &peers[0]) {
|
||||
Ok(_) => println!("Sent First"),
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
return;
|
||||
}
|
||||
};
|
||||
match udp_socket.send_to(peers[0].as_bytes(), &peers[1]) {
|
||||
Ok(_) => println!("Sent Second"),
|
||||
Err(err_val) => eprintln!("{}", err_val),
|
||||
};
|
||||
}
|
||||
|
||||
fn client(addr: &str) {
|
||||
let udp_socket = match UdpSocket::bind(addr) {
|
||||
Ok(udp_socket) => udp_socket,
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
return;
|
||||
}
|
||||
};
|
||||
match udp_socket.send_to(
|
||||
"Hello Sir".as_bytes(),
|
||||
"0.0.0.0", /* I change it with public address */
|
||||
) {
|
||||
Ok(_) => {}
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
}
|
||||
};
|
||||
let mut buffer = [0_u8; 100];
|
||||
let (data_size, peer) = match udp_socket.recv_from(&mut buffer) {
|
||||
Ok((data_size, peer)) => (data_size, peer),
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
return;
|
||||
}
|
||||
};
|
||||
let data = buffer.split_at(data_size).0;
|
||||
let message = String::from_utf8_lossy(data).into_owned();
|
||||
println!("{}:{} = {}", peer.ip(), peer.port(), message);
|
||||
|
||||
match udp_socket.send_to("Hello Dear".as_bytes(), message) {
|
||||
Ok(_) => {}
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
let mut buffer = [0_u8; 100];
|
||||
let (data_size, peer) = match udp_socket.recv_from(&mut buffer) {
|
||||
Ok((data_size, peer)) => (data_size, peer),
|
||||
Err(err_val) => {
|
||||
eprintln!("{}", err_val);
|
||||
return;
|
||||
},
|
||||
};
|
||||
let data = buffer.split_at(data_size).0;
|
||||
let message = String::from_utf8_lossy(data).into_owned();
|
||||
println!("{}:{} = {}", peer.ip(), peer.port(), message);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue