gpt4 book ai didi

tcp - 优雅退出 TcpListener.incoming()

转载 作者:可可西里 更新时间:2023-11-01 02:47:54 26 4
gpt4 key购买 nike

来自 rust 标准网络库:

let listener = TcpListener::bind(("127.0.0.1", port)).unwrap();

info!("Opened socket on localhost port {}", port);

// accept connections and process them serially
for stream in listener.incoming() {
break;
}

info!("closed socket");

如何让听者停止倾听?它在 API 中表示,当监听器被删除时,它会停止。但是,如果 incoming() 是一个阻塞调用,我们如何丢弃它呢?最好没有像 tokio/mio 这样的外部 crate 。

最佳答案

您需要使用 set_nonblocking() 方法将 TcpListener 置于非阻塞模式,如下所示:

use std::io;
use std::net::TcpListener;

let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
listener.set_nonblocking(true).expect("Cannot set non-blocking");

for stream in listener.incoming() {
match stream {
Ok(s) => {
// do something with the TcpStream
handle_connection(s);
}
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
// Decide if we should exit
break;
// Decide if we should try to accept a connection again
continue;
}
Err(e) => panic!("encountered IO error: {}", e),
}
}

incoming() 调用将立即返回一个 Result<> 类型,而不是等待连接。如果 Result 为 Ok(),则连接已建立,您可以处理它。如果结果是 Err(WouldBlock),这实际上不是错误,只是在 incoming() 检查套接字的确切时刻没有挂起的连接。

请注意,在 WouldBlock 的情况下,您可能希望在继续之前放置一个 sleep() 或其他东西,否则您的程序将快速轮询 incoming() 函数以检查连接,从而导致 CPU 使用率过高。

代码示例改编自 here

关于tcp - 优雅退出 TcpListener.incoming(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56692961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com