Сервер TCP в Rust
Серверная сторона сначала занимает порт на выбранном хосте. Пока слушатель жив, ядро складывает входящие заявки в очередь, и программа может взять следующую, когда будет готова.
Создадим слушатель на локальном адресе и дождемся первого гостя:
use std::net::TcpListener;
fn main() {
let listener = match TcpListener::bind("127.0.0.1:7000") {
Ok(l) => l,
Err(e) => {
eprintln!("bind error: {}", e);
return;
}
};
let (stream, peer) = match listener.accept() {
Ok(pair) => pair,
Err(e) => {
eprintln!("accept error: {}", e);
return;
}
};
println!("peer {}", peer);
let _ = stream;
}
Успешный прием возвращает пару: поток для обмена и адрес удаленной стороны. Пока программа ждет на приеме, она не идет дальше, пока кто-то не постучится или не случится ошибка.
Если порт уже занят другой программой, привязка вернет ошибку. Разберем ее отдельно от сбоя при ожидании гостя:
use std::net::TcpListener;
fn main() {
match TcpListener::bind("127.0.0.1:7000") {
Ok(_listener) => println!("ready"),
Err(e) => eprintln!("bind error: {}", e),
}
}
Дан адрес:
let addr = "127.0.0.1:7000";
Займите этот адрес слушателем, дождитесь одного входящего потока и выведите адрес гостя на экран.
Дан адрес:
let addr = "127.0.0.1:7000";
Привяжите слушатель и при успехе
напечатайте listen, не дожидаясь
гостя.
Скажите, зачем после приема сохраняют поток в переменной, даже если сразу ничего не читают.