Метод recv_from
Метод recv_from класса UdpSocket
принимает одну UDP-дейтаграмму от любого
отправителя. Метод блокирует текущий поток до тех
пор, пока не придёт хотя бы одна дейтаграмма.
Параметром метод принимает изменяемый буфер,
в который будет записано полученное сообщение.
Возвращает метод результат Result,
содержащий кортеж из количества прочитанных
байт и адреса источника SocketAddr.
Синтаксис
socket.recv_from(buf)
Пример
Давайте создадим UDP-сокет, привязанный к локальному адресу, и примем одну дейтаграмму от отправителя:
use std::net::UdpSocket;
fn main()
{
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
let addr = socket.local_addr().unwrap();
let sender = UdpSocket::bind("127.0.0.1:0").unwrap();
sender.send_to(b"abcde", addr).unwrap();
let mut buf = [0u8; 1024];
let (n, src) = socket.recv_from(&mut buf).unwrap();
println!("{}", n);
println!("{}", String::from_utf8_lossy(&buf[..n]));
}
Результат выполнения кода:
5
"abcde"
Пример
Давайте примем несколько дейтаграмм в цикле и выведем адрес источника для каждой из них:
use std::net::UdpSocket;
fn main()
{
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
let addr = socket.local_addr().unwrap();
let sender = UdpSocket::bind("127.0.0.1:0").unwrap();
sender.send_to(b"12345", addr).unwrap();
sender.send_to(b"abcde", addr).unwrap();
let mut buf = [0u8; 1024];
for _ in 0..2 {
let (n, src) = socket.recv_from(&mut buf).unwrap();
println!("{} bytes from {}", n, src);
}
}
Результат выполнения кода:
5 bytes from 127.0.0.1:xxxxx
5 bytes from 127.0.0.1:xxxxx