gpt4 book ai didi

Rust TcpListener 失败但未显示错误

转载 作者:行者123 更新时间:2023-11-29 08:17:15 24 4
gpt4 key购买 nike

以下代码与 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);
}

最佳答案

重要的因素是 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()如果失败,你会得到一些总是立即产生绑定(bind)或监听错误的东西。

关于Rust TcpListener 失败但未显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26687315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com