2014-11-01 112 views
1

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

如果我更改端口,它将工作。如果我将在listen()之后添加unwrap(),则代码将显示“拒绝访问错误”。我读listen()返回IOResult<T>,如果它不使用,则不会发生错误。但我想我使用它调用acceptor.incoming(),我期望在这次调用时出现错误。为什么没有发生?

锈病版本:rustc 0.13.0-夜间(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); 
} 
+0

您必须是root用户才能打开特权端口(<1024) – Arjan 2014-11-01 09:03:57

+0

我知道这对我来说不是问题。问题是程序没有输入任何错误。 – 2014-11-01 09:08:20

+1

@FedorovMikhail用'println!(“{}”,e)替换'/ *连接失败* /';'你会看到错误。 – Levans 2014-11-01 09:12:04

回答

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()时,您会得到一些将始终立即产生绑定或侦听错误(如果失败)的东西。