以下代码与TcpListener的Rust文档中的代码几乎相同。
当代码在Ubuntu 14.04上运行时,它不会产生任何错误,但同时它不起作用! (netstat -an | grep ':80'
或telnet都没有连接到此服务器。)
如果我更改端口,它将起作用。如果我在unwrap()
之后添加listen()
,则代码将显示"访问被拒绝错误"。我读到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);
}
答案 0 :(得分:2)
重要因素是Listener
和Acceptor
都是为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()
时,如果它们失败,您将获得始终立即产生绑定或侦听错误的内容