【问题标题】:Rust TcpListener failed but no errors shownRust TcpListener 失败但没有显示错误
【发布时间】:2014-11-01 08:02:09
【问题描述】:

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

如果我更改端口,它将起作用。如果我在listen() 之后添加unwrap(),那么代码将显示“访问被拒绝错误”。我读到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); 
}

【问题讨论】:

  • 您必须是 root 才能打开特权端口 (
  • 我明白,这对我来说不是问题。问题是程序没有输入任何错误。
  • @FedorovMikhail 将 /* connection failed */ 替换为 println!("{}", e);,您将看到错误。

标签: rust


【解决方案1】:

重要的因素是ListenerAcceptor 都是为IoResult<T> 实现的,其中T 实现了适当的特征。这是来自src/libstd/io/result.rs的sn-p:

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&lt;TcpListener&gt;,您可以立即调用.listen().listen() 类似地返回 IoResult&lt;TcpAcceptor&gt;,并为此实现了 Acceptor,因此当您调用 .incoming() 时,您会得到一些东西,如果它们失败,将始终立即产生绑定或侦听错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 2012-01-30
    • 2019-10-09
    • 1970-01-01
    • 2017-08-05
    • 2012-12-03
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多