Метод peek_from
Метод peek_from класса UdpSocket позволяет
заглянуть в очередь входящих UDP-датаграмм и получить
данные, не удаляя их из буфера сокета. Это отличается
от метода recv_from, который извлекает датаграмму
из очереди. Метод принимает изменяемый буфер, в который
будут записаны данные, и возвращает кортеж из количества
прочитанных байт и адреса отправителя.
Синтаксис
udp_socket.peek_from(buf)
Пример
Давайте создадим UDP-сокет, отправим на него датаграмму
и дважды вызовем peek_from, чтобы убедиться,
что данные остаются в очереди:
use std::net::UdpSocket;
fn main()
{
let receiver = UdpSocket::bind("127.0.0.1:0").unwrap();
let addr = receiver.local_addr().unwrap();
let sender = UdpSocket::bind("127.0.0.1:0").unwrap();
sender.send_to(b"abcde", addr).unwrap();
let mut buf1 = [0u8; 5];
let (n1, from1) = receiver.peek_from(&mut buf1).unwrap();
println!("{} {}", n1, String::from_utf8_lossy(&buf1));
let mut buf2 = [0u8; 5];
let (n2, from2) = receiver.peek_from(&mut buf2).unwrap();
println!("{} {}", n2, String::from_utf8_lossy(&buf2));
}
Результат выполнения кода:
5 abcde
5 abcde
Пример
Давайте сравним поведение peek_from и
recv_from: после вызова recv_from
датаграмма удаляется из очереди, и повторный вызов
peek_from будет блокироваться:
use std::net::UdpSocket;
fn main()
{
let receiver = UdpSocket::bind("127.0.0.1:0").unwrap();
let addr = receiver.local_addr().unwrap();
let sender = UdpSocket::bind("127.0.0.1:0").unwrap();
sender.send_to(b"12345", addr).unwrap();
let mut buf = [0u8; 5];
let (n, from) = receiver.recv_from(&mut buf).unwrap();
println!("{} {}", n, String::from_utf8_lossy(&buf));
receiver.set_read_timeout(Some(std::time::Duration::from_millis(100))).unwrap();
let mut buf2 = [0u8; 5];
let res = receiver.peek_from(&mut buf2);
println!("{:?}", res.is_err());
}
Результат выполнения кода:
5 12345
true