РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1163 of 1245 menu

Метод 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

Смотрите также

  • метод recv_from,
    который извлекает датаграмму из очереди сокета
  • метод send_to,
    который отправляет датаграмму по указанному адресу
  • метод bind,
    который привязывает сокет к локальному адресу
  • класс UdpSocket,
    который представляет UDP-сокет
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить