如何打破阻塞TcpListener :: accept调用?

Pet*_*iak 6 api multithreading shutdown rust

我在一个单独的线程中的循环中运行acceptTCP侦听器功能.我想优雅地关闭这个线程,但我看不到任何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());
}
Run Code Online (Sandbox Code Playgroud)

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

(作为参考,我在Rust用户论坛上也问过这个问题)

lum*_*max 5

问题是一个基本问题,因为最后accept()调用转换为a libc::accept()(参见此处此处).

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


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