【问题标题】:How to break from the blocking TcpListener::accept call?如何摆脱阻塞的 TcpListener::accept 调用?
【发布时间】:2015-04-09 14:49:01
【问题描述】:

我在一个单独的线程中循环运行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

【问题讨论】:

    标签: multithreading api rust shutdown


    【解决方案1】:

    这个问题是一个基本问题,因为最后accept() 调用转换为libc::accept()(请参阅herehere)。

    解决方案是使用非阻塞 io,例如查看 mio


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

    【讨论】:

    • 谢谢,您可能是对的,API 中缺少该功能。我给了你+1,但我想再等一会儿,也许有人有不同的解释。
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2013-01-19
    • 2011-01-29
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多