环境
- 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..$.*@[email protected].\...#jiangbo
21:48:11.282772 IP 127.0.0.1.4444 > 127.0.0.1.50799: UDP, length 8
E..$..@[email protected]..........\.o...#
obgnaij
21:48:15.867097 IP 127.0.0.1.50799 > 127.0.0.1.4444: UDP, length 9
E..%.+@[email protected].\...$zhangsan
21:48:15.867157 IP 127.0.0.1.4444 > 127.0.0.1.50799: UDP, length 9
E..%..@[email protected]..........\.o...$
nasgnahz
总结
使用 Rust 的标准库,实现 UDP 的通信。