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

问题描述 投票:0回答:1

我正在单独线程的循环中运行 TCP 侦听器

accept 函数。我想优雅地关闭这个线程,但我看不到任何可以用来中断接受的 
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());
}

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

(仅供参考,我也在 Rust 用户论坛上问过这个问题

multithreading rust tcp shutdown
1个回答
5
投票

这个问题是一个基本问题,因为最终

accept()
调用会转化为
libc::accept()
(参见 herehere)。

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


Edi: 经过一番考虑,我研究了使用

accept()
中断
close()
的可能性。好像不太靠谱。但是this出现了:使用
shutdown()
TcpStream
公开了这个函数,但这似乎是唯一的情况。可能是 API 的缺点?

© www.soinside.com 2019 - 2024. All rights reserved.