如何从阻塞的 TcpListener::accept 调用中中断?

How to break from the blocking TcpListener::accept call?

我 运行 accept function of a TCP listener 在一个单独的线程中循环。我想优雅地关闭此线程,但我看不到任何类型的 shutdown 机制可以用来中断接受。

我目前的方法是这样的:

use std::net::TcpListener;
use std::thread::spawn;

fn main() {
    let tcp_listener = TcpListener::bind((("0.0.0.0"), 0)).unwrap();
    let tcp_listener2 = tcp_listener.try_clone().unwrap();

    let t = spawn(move || {
        loop {
            match tcp_listener2.accept() {
                Ok(_) => { }
                Err(_) => { break; }
           }
        }
    });

    drop(tcp_listener);
    assert!(t.join().is_ok());
}

但这并不能解决问题(可能是因为我只删除了克隆的副本?)。关于如何正确关闭此类线程的任何想法?

(供参考,I asked this question on rust user forum as well

这个问题是一个基础问题,因为最后 accept() 调用转换为 libc::accept()(参见 here and here)。

解决方案是使用 nonblocking-io,例如查看 mio


Edi: 经过一番考虑,我研究了使用 close() 中断 accept() 的可能性。这似乎是不可靠的。但是 this 出现了:使用 shutdown()TcpStream 暴露了这个功能,但它似乎是唯一的情况。可能是 API 的缺点?