Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpUdRv 265 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, addr)) => { println!("{} bytes from {}", n, addr); } Err(_) => println!("recv fail"), } }

Число n не больше размера буфера: лишние байты отбрасываются, если пакет оказался длиннее. Адрес в addr совпадает с тем, что указал отправитель.

Из буфера берут только первые n элементов и при необходимости переводят их в текст:

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, _addr)) => { let piece = &buf[..n]; match std::str::from_utf8(piece) { Ok(text) => println!("{}", text), Err(_) => println!("bad utf8"), } } Err(_) => {} } }

Дан адрес:

let addr = "127.0.0.1:7002";

Привяжите сокет к этому адресу, прочитайте один пакет в массив на 64 байт и выведите длину из варианта успеха.

Дан адрес:

let addr = "127.0.0.1:7001";

Откройте сокет на 127.0.0.1:7002, примите пакет и напечатайте адрес отправителя из результата операции.

Скажите, почему для приема нужен буфер фиксированного размера, а не одна переменная байта.

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