Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpUdRp 266 of 288 menu
◀ ▶

Ответ по 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 взято из успешного приема.

Скажите, чем ответ на адрес из приема отличается от отправки только на заранее известный порт.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить