Ответ по UDP в Rust
В отличие от заранее известного адреса клиента, сервер часто узнает отправителя только из результата приема. Ответ передают на тот же адрес, который пришел вместе с датаграммой.
Сокет на порту 7002 примет пакет
и сразу отправит короткий ответ обратно:
use std::net::UdpSocket;
fn main() {
let socket = match UdpSocket::bind("127.0.0.1:7002") {
Ok(s) => s,
Err(_) => return,
};
let mut buf = [0u8; 32];
match socket.recv_from(&mut buf) {
Ok((_n, peer)) => {
let answer = b"pong";
match socket.send_to(answer, peer) {
Ok(k) => println!("reply {}", k),
Err(_) => println!("reply fail"),
}
}
Err(_) => println!("recv fail"),
}
}
Переменная peer хранит адрес
отправителя из первого пакета. Второй
вызов передачи использует его как
назначение, не подставляя строку вручную.
Тот же прием подходит, если нужно эхо-вернуть часть прочитанных байт:
use std::net::UdpSocket;
fn main() {
let socket = match UdpSocket::bind("127.0.0.1:7002") {
Ok(s) => s,
Err(_) => return,
};
let mut buf = [0u8; 16];
match socket.recv_from(&mut buf) {
Ok((n, peer)) => {
let echo = &buf[..n];
match socket.send_to(echo, peer) {
Ok(_) => {}
Err(_) => {}
}
}
Err(_) => {}
}
}
Дан адрес:
let addr = "127.0.0.1:7002";
Привяжите сокет к этому адресу, примите
один пакет и передайте b"ack"
на адрес из результата приема. При
успехе выведите sent.
Дан адрес:
let addr = "127.0.0.1:7001";
На порту 7002 прочитайте пакет
в буфер и верните первые n
байт отправителю, где n взято
из успешного приема.
Скажите, чем ответ на адрес из приема отличается от отправки только на заранее известный порт.