如何在 Rust 中使用 TcpStream 实现关闭 TCP 连接的超时?

How can I implement a timeout for closing a TCP connection using TcpStream in Rust?

提问人:ohxdMAGsDCiCJ 提问时间:11/14/2023 最后编辑:ohxdMAGsDCiCJ 更新时间:11/15/2023 访问量:47

问:

我有一个函数,它连接到 TCP 端点,发送一条消息,然后等待两条消息。函数完成后,我想关闭连接。但是,我想为整个函数添加一个超时,以便如果消息交换未在指定时间内完成,连接将断开。在 Rust 中使用 TcpStream 实现此目的的理想方法是什么?

目前,我正在使用 tokio https://docs.rs/tokio/latest/tokio/time/fn.timeout.html 的超时功能。但是,它似乎不是我的用例的最佳选择。

use std::time::Duration;

use tokio::{net::TcpStream, time::timeout};

#[tokio::main]
async fn main() {
    connect().await;
}

async fn connect() {
    let conn = TcpStream::connect("127.0.0.1:7000").await.unwrap();

    // drop the connection within 2 seconds
    let _ = timeout(Duration::from_secs(2), do_something(conn)).await;
}
async fn do_something(conn: TcpStream) {
    // do something
}
蚀TCP

评论

2赞 Chayim Friedman 11/14/2023
为什么你认为对你的用例不利?timeout()
0赞 Aleksander Krauze 11/14/2023
我假设您正在使用 TcpStream 来自?tokio
1赞 Aleksander Krauze 11/14/2023
“但是,对于我的用例来说,它似乎不是最佳选择”。请展示您的用例的最小化版本,并解释“最佳选择”是什么。如果您想做一些具体的事情,请与我们分享,以便我们可以讨论具体问题。
0赞 ohxdMAGsDCiCJ 11/15/2023
您好@AleksanderKrauze,我刚刚将代码添加到问题中。
0赞 ohxdMAGsDCiCJ 11/15/2023
@ChayimFriedman 看起来没有正确实现。

答:

0赞 Sven Marnach 11/14/2023 #1

对于阻塞流,通常为单个连接、读取或写入操作设置超时。非阻塞蒸汽在系统调用级别没有类似物。对于每个连接/读/写,使用应该为您提供与相应阻塞操作的超时大致相同的行为。您还可以使用 tokio_io_timeout::TimeoutStream 配置所有读取和写入操作的超时。tokio::time::timeout()