Rust TcpListener失败但未显示错误

时间:2014-11-01 08:02:10

标签: rust

以下代码与TcpListener的Rust文档中的代码几乎相同。 当代码在Ubuntu 14.04上运行时,它不会产生任何错误,但同时它不起作用! (netstat -an | grep ':80'或telnet都没有连接到此服务器。)

如果我更改端口,它将起作用。如果我在unwrap()之后添加listen(),则代码将显示&#34;访问被拒绝错误&#34;。我读到listen()返回IOResult<T>,如果没有使用,则不会发生错误。但我认为我使用它来调用acceptor.incoming()并且我希望在此调用时出错。为什么没有发生?

Rust版本:rustc 0.13.0-nightly(bd7138dd6 2014-10-27 23:02:55 +0000)

Ubuntu 14.04

fn main() {
    let listener = TcpListener::bind("127.0.0.1", 80);

    // bind the listener to the specified address
    let mut acceptor = listener.listen(); //unwrap() here

    fn handle_client(mut stream: TcpStream) {
        println!("a");
    }
    // accept connections and process them, spawning a new tasks for each one
    for stream in acceptor.incoming() {
        match stream {
        Err(e) => { /* connection failed */ }
        Ok(stream) =>
            spawn(proc() {
                // connection succeeded
                handle_client(stream)
            })
        }
    }
    // close the socket server
    drop(acceptor); 
}

1 个答案:

答案 0 :(得分:2)

重要因素是ListenerAcceptor都是为IoResult<T>实现的,其中T实现了相应的特征。这是src/libstd/io/result.rs的代码段:

impl<T, A: Acceptor<T>, L: Listener<T, A>> Listener<T, A> for IoResult<L> {
    fn listen(self) -> IoResult<A> {
        match self {
            Ok(listener) => listener.listen(),
            Err(e) => Err(e),
        }
    }
}

impl<T, A: Acceptor<T>> Acceptor<T> for IoResult<A> {
    fn accept(&mut self) -> IoResult<T> {
        match *self {
            Ok(ref mut acceptor) => acceptor.accept(),
            Err(ref e) => Err(e.clone()),
        }
    }
}

因此,TcpListener::bind会返回IoResult<TcpListener>,您可以立即致电.listen(); .listen()类似地返回IoResult<TcpAcceptor>,并为此实现了Acceptor,因此当您调用.incoming()时,如果它们失败,您将获得始终立即产生绑定或侦听错误的内容