目前我这样做是为了阻止服务器在外部请求时接受进一步的连接(例如客户端发送“关闭”消息):
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)
超时,这似乎是不可避免的。是否有可能做出比这更好的事情?