環境
- Time 2022-11-25
- WSL-Ubuntu 22.04
- Rust 1.65.0
前言
說明
參考:https://doc.rust-lang.org/std/net/struct.UdpSocket.html
目標
之前透過接收整個 IP 和 UDP 報文來實現了通訊,這裡去除報文頭的細節,直接通訊。
main.rs
UDP 由標準庫直接支援,可以直接使用。
將傳送過來的資訊進行反轉,然後傳送回去。
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("127.0.0.1:4444")?;
loop {
let mut buffer = [0; 1500];
let (size, src) = socket.recv_from(&mut buffer)?;
let buffer = &mut buffer[..size];
buffer.reverse();
socket.send_to(buffer, src)?;
}
}
傳送請求
root@jiangbo12490:~# nc -u 127.0.0.1 4444
jiangbo
obgnaijzhangsan
nasgnahz
TCPDUMP 抓包
root@jiangbo12490:~# tcpdump -A -n -i lo port 4444
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
21:48:11.282710 IP 127.0.0.1.50799 > 127.0.0.1.4444: UDP, length 8
E..$.*@.@............o.\...#jiangbo
21:48:11.282772 IP 127.0.0.1.4444 > 127.0.0.1.50799: UDP, length 8
E..$..@.@.L..........\.o...#
obgnaij
21:48:15.867097 IP 127.0.0.1.50799 > 127.0.0.1.4444: UDP, length 9
E..%.+@.@............o.\...$zhangsan
21:48:15.867157 IP 127.0.0.1.4444 > 127.0.0.1.50799: UDP, length 9
E..%..@.@.K..........\.o...$
nasgnahz
總結
使用 Rust 的標準庫,實現 UDP 的通訊。