以下代码与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 回答
重要的因素是
Listener
和Acceptor
都是为IoResult<T>
实现的,其中T
实现了适当的特征 . 这是src/libstd/io/result.rs
的片段:因此,TcpListener::bind返回
IoResult<TcpListener>
,您可以立即调用.listen()
;.listen()
类似地返回IoResult<TcpAcceptor>
,并且为此实现了Acceptor
,所以当你调用.incoming()
时,你会得到一些东西,如果它们失败,它们将永远立即产生绑定或监听错误 .