Rust UDP服务器示例如何安全?
我有一个UDP服务器示例,它正在工作:Rust UDP服务器示例如何安全?,rust,thread-safety,Rust,Thread Safety,我有一个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::spaw
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);
}
}
}
看起来所有传入的UDP数据包都共享同一个缓冲区
如果两个UDP数据包同时到达,第二个数据包是否会覆盖buf
中的第一个数据包,导致第二个数据包的(反向)内容被发送回两个发送方
生锈是如何防止的?不,缓冲区不会在线程之间共享,而是在启动新的线程之前隐式复制的。从: 如果元素类型为Copy,则任何大小的数组都是Copy 因此,move关键字强制缓冲区移动,这会导致复制,因为在循环的下一次迭代中可以使用相同的缓冲区