Отправка UDP-пакета в Rust
Перед отправкой сокет нужно открыть на
своем порту, иначе ОС не примет исходящий
трафик от программы. Локальный адрес
127.0.0.1 удобен для примеров на
одной машине: пакет не уходит в интернет.
Подключим модуль сети, создадим сокет
на порту 7001 и передадим короткое
сообщение на порт 7002:
use std::net::UdpSocket;
fn main() {
let socket = match UdpSocket::bind("127.0.0.1:7001") {
Ok(s) => s,
Err(_) => {
println!("bind fail");
return;
}
};
let payload = b"ping";
match socket.send_to(payload, "127.0.0.1:7002") {
Ok(n) => println!("sent {}", n),
Err(_) => println!("send fail"),
}
}
При успехе метод возвращает, сколько байт ушло в сеть. Если порт занят или адрес неверный, сопоставление попадет в ветку ошибки.
Тот же сокет может отправить несколько пакетов подряд на один и тот же адрес:
use std::net::UdpSocket;
fn main() {
let socket = match UdpSocket::bind("127.0.0.1:7001") {
Ok(s) => s,
Err(_) => return,
};
let first = b"one";
let second = b"two";
match socket.send_to(first, "127.0.0.1:7002") {
Ok(_) => {}
Err(_) => return,
}
match socket.send_to(second, "127.0.0.1:7002") {
Ok(n) => println!("second {}", n),
Err(_) => println!("fail"),
}
}
Дан адрес:
let addr = "127.0.0.1:7002";
Откройте сокет на 127.0.0.1:7001,
передайте байты b"hi" на этот адрес
и выведите ok только при успешной
отправке.
Дан адрес:
let addr = "127.0.0.1:7001";
Привяжите сокет к этому адресу, отправьте
b"ask" на 127.0.0.1:7002
и напечатайте число переданных байт
из варианта успеха.
Скажите, зачем в примере сокет сначала открывают на своем порту, а не только указывают адрес получателя.