feat: udp hole puncher

This commit is contained in:
Ahmet Kaan GÜMÜŞ 2024-09-09 03:42:36 +03:00
parent c1eb13aa0a
commit 20750ec058
3 changed files with 116 additions and 1 deletions

6
.gitignore vendored
View file

@ -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
View file

@ -0,0 +1,6 @@
[package]
name = "rust-udp-hole-puncher"
version = "0.1.0"
edition = "2021"
[dependencies]

105
src/main.rs Normal file
View 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);
}