UDP 与 TCP 的差别不只是「不可靠」。这篇用 Rust 的 UdpSocket 验证:消息边界、截断、大小上限、发给不存在的对端、以及真实的丢包比例。
编译:成功
运行(退出码 0):
第 1 次 recv_from:3 字节 "abc",来自发送端地址 == tx 的地址: true
第 2 次 recv_from:5 字节 "defgh",来自发送端地址 == tx 的地址: true
第 3 次 recv_from:2 字节 "ij",来自发送端地址 == tx 的地址: trueTCP 的字节流见TCP Listener 与 TcpStream。
编译:成功
运行(退出码 0):
用 4 字节缓冲区读一个 10 字节的数据报:recv_from 返回 4,内容 "0123"(剩下的 6 字节丢了)
下一次 recv_from 得到的是下一个数据报:"NEXT"(不是上一个的剩余部分) 编译:成功
运行(退出码 0):
send_to 成功的最大数据报:9216 字节;9217 字节失败:Err((Uncategorized, Some(40)))这个上限是 macOS 的系统参数(net.inet.udp.maxdgram 一类),换系统不同;没有查该参数。
编译:成功
运行(退出码 0):
send_to 一个没人监听的端口:Ok(2)(发送方不知道对端不存在)
connect 到死端口后 send + recv:send 成功;recv 得到 Err((ConnectionRefused, Some(61))) 编译:成功
运行(退出码 0):
发送 20000 个数据报(共 20000 KB),接收端收到 762 个,丢了 19238 个(96.2%);发送端 send_to 全部返回了成功丢包比例取决于接收缓冲区大小与发送速度,这次实测是 96.2%,每次不同。