UDP 服务器示例如何安全?

fad*_*bee 4 thread-safety rust

我有一个 UDP 服务器示例,它正在运行:

let mut socket = UdpSocket::bind("127.0.0.1:12345")?;
let mut buf = [0; 4096];
loop {
    let sock = socket.try_clone()?;
    match socket.recv_from(&mut buf) {
        Ok((amt, src)) => {
            thread::spawn(move || {
                println!("Handling connection from {}", &src);
                let buf = &mut buf[..amt];
                buf.reverse();
                sock.send_to(&buf, &src).expect("error sending");
            });
        },
        Err(err) => {
            eprintln!("Err: {}", err);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来所有传入的 UDP 数据包共享相同的缓冲区。

如果两个 UDP 数据包同时到达,第二个数据包是否会覆盖第一个数据包buf,导致第二个数据包的(反向)内容被发送回两个发送者?

Rust 如何防止这种情况发生?

Kit*_*tsu 8

不,缓冲区不在线程之间共享,而是在启动新线程之前隐式复制。来自数组文档

如果元素类型是 Copy,则任何大小的数组都是 Copy

因此,move关键字强制缓冲区移动,这会导致复制,因为可以在循环的下一次迭代中使用相同的缓冲区。