首页 文章

Rust TcpListener失败但未显示错误

提问于
浏览
1

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

如果我改变端口它将工作 . 如果我在 listen() 之后添加 unwrap() ,则代码将显示"access denied error" . 我读到 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 回答

  • 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() 时,你会得到一些东西,如果它们失败,它们将永远立即产生绑定或监听错误 .

相关问题