Прием 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,
примите пакет и напечатайте адрес
отправителя из результата операции.
Скажите, почему для приема нужен буфер фиксированного размера, а не одна переменная байта.