从Rust Std Net库:let listener = TcpListener::bind(("127.0.0.1", port)).unwrap();info!("Opened socket on localhost port {}", port);// accept connections and process them seriallyfor stream in listener.incoming() { break;}info!("closed socket");如何让听者停止倾听?它在API中说,当侦听器被丢弃时,它会停止。但是,如果incoming()是阻塞调用,我们如何丢弃它?最好没有像Tokio/Mio这样的外部板条箱。 最佳答案 您需要使用set_non blocking()方法将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), }}传入()调用将立即返回结果类型,而不是等待连接。如果result为ok(),则已建立连接,您可以对其进行处理。如果结果是err(wouldblock),这实际上不是一个错误,只是在incoming()检查套接字的确切时刻没有连接挂起。请注意,在wouldblock的情况下,您可能需要在继续之前放置sleep()或其他东西,否则您的程序将快速轮询incoming()函数以检查连接,从而导致高CPU使用率。代码示例改编自here
08-03 14:10