阻止网络服务器接受进一步的连接

时间:2014-05-01 10:57:31

标签: networking rust

目前我这样做是为了阻止服务器在外部请求时接受进一步的连接(例如客户端发送“关闭”消息):

let listener = try_err!(TcpListener::bind(addr), "cannot bind: {}");

let (tstreams, rstreams) = channel();
let (tshutdown, rshutdown) = channel();
spawn(proc() {
    let mut acceptor = try_err!(listener.listen(), "cannot listen: {}");

    loop {
        acceptor.set_timeout(Some(100));
        match acceptor.accept() {
            Ok(stream) => tstreams.send(stream),
            Err(ref e) if e.kind == TimedOut => {}
            Err(e) => println!("Failed to accept: {}", e)
        }
        match rshutdown.try_recv() {
            Ok(()) | Err(Disconnected) => break,
            Err(Empty) => {}
        }
    }
});

然后我可以通过rstreams频道接收传入的连接,并且可以通过tshutdown频道关闭接受器循环。

但是,我不喜欢这种方法,尤其是任意Some(100)超时,这似乎是不可避免的。是否有可能做出比这更好的事情?

1 个答案:

答案 0 :(得分:0)

我没有看到更好的方法来实现这一点,直到整个' how to do async properly?'问题解决了。