我正在try 使用mio来构建一个高性能的TCP服务器.我从这里的示例https://github.com/tokio-rs/mio/blob/master/examples/tcp_server.rs开始,并使用HyperFine运行这段代码作为一种基准测试/试探服务器.

fn main() {
    let mut stream = TcpStream::connect("127.0.0.1:9000").expect("Failed to connect to server.");
    stream.write("some_data".as_bytes()).unwrap();
}

这总是伴随着下面的错误出现

Error: Os { code: 54, kind: ConnectionReset, message: "Connection reset by peer" }

从本例中的第156行抛出.

我理解,如果抛出这个错误,这是预期的行为,我正在试图理解是什么导致TcpStream首先抛出这个错误.我觉得这个例子应该可以处理相当多的负载.

此外,如果这可能不是开始构建MIO的最佳位置,我将非常感激任何关于在哪里寻找的指示.

推荐答案

如果套接字在仍有未读数据时关闭,则TCP堆栈将发出TCP重置.然后,此TCP重置将导致对等体中的"Connection Reset by Peer"(ECONNRESET)错误.

您链接到的服务器写入数据和读取数据.您的客户端仅写入数据,但关闭连接而不从服务器读取数据.这意味着当客户端关闭时,有来自服务器的未读数据,从而导致客户端的TCP堆栈生成一个TCP重置,而服务器得到"由对等重置的连接".

Rust相关问答推荐

为什么实例方法可以像Rust中的静态方法一样被调用?

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

将PathBuf转换为字符串

是否可以在不切换到下一个位置的情况下获得迭代器值:

关于 map 闭合求和的问题

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

通过mem::transmute将数组展平安全吗?

为什么带有生命周期指定的方法不能被调用两次?

为什么这段 Rust 代码会在没有递归或循环的情况下导致堆栈溢出?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

std::vector::shrink_to_fit 如何在 Rust 中工作?

如何使用泛型满足 tokio 异步任务中的生命周期界限

内部值发生变化时 Rc 的行为

为什么 i32 Box 类型可以在 Rust 中向下转换?

如何展平以下嵌套的 if let 和 if 语句?

当我在 struct 中存储异步函数时,为什么它需要生命周期

有没有办法使用 NASM 语法进行内联汇编?

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?

如何在 Rust 中构建一个 str

如何阅读 HttpRequest 主体