Почему for l oop не завершается при использовании входящего итератора Tcplistener - PullRequest
1 голос
/ 23 апреля 2020

Глядя на библию ржавчины, есть следующий код:

use std::net::TcpListener;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();

    for stream in listener.incoming() {
        let stream = stream.unwrap();

        println!("Connection established!");
    }
}

Мне было интересно, почему для l oop не выходит. После одной итерации for для l oop (ie. Если никто не подключается), не должно ли for l oop fini sh и основная функция выйти?

1 Ответ

3 голосов
/ 23 апреля 2020

Это предназначено. Из документации для TcpListener относительно incoming() примечания:

Возвращенный итератор никогда не вернет None и также не даст структуру равноправного SocketAddr. Повторение по нему эквивалентно вызову accept в al oop.

И accept() примечания:

Эта функция будет блокировать вызывающий поток до нового TCP-соединение установлено.

Таким образом, оно предназначено для бесконечного ожидания соединений и не приводит к выполнению до тех пор, пока оно не будет сделано.


Вы можете изменить это поведение, вызвав listener.set_nonblocking(true) иметь accept (и, следовательно, итератор incoming) для немедленного выдачи с ошибкой io::ErrorKind::WouldBlock, если нет ожидающих соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...