tcp - set_timeout() 在 TcpStream 上究竟是如何工作的?

标签 tcp timeout rust

我正在使用 TcpStream .我正在使用的基本结构是:

loop {
    if /* new data in the stream */ { /* handle it */ }
    /* do a lot of other stuff */
}

所以 set_timeout() 似乎是我需要的,但我对它的工作原理有点困惑。文档说:

This function will set a timeout for all blocking operations (including reads and writes) on this stream. The timeout specified is a relative time, in milliseconds, into the future after which point operations will time out. This means that the timeout must be reset periodically to keep it from expiring.

所以我希望每次检查新数据是否可用之前都必须重置超时,否则一段时间后我只会有 Err(TimeOut)

但情况似乎并非如此:实际上,如果我一劳永逸地设置一个非常低的超时(如 10 毫秒),循环就会完全按照我的要求进行。如果有则返回新数据,如果没有则返回Err(TimeOut)

我是否误解了文档?使用这种行为对我来说安全吗?

最佳答案

我原以为它会像套接字超时一样工作,就像大多数操作系统中的套接字属性一样,并且可以通过带有 SO_TIMEOUT 或类似东西的编程语言获得。有了这样的套接字超时,每当您在套接字上启动阻塞操作(如读取、写入、连接)时,计时器就会启动。要么操作将在时间范围内成功,要么定时器将被触发并且操作因超时而失败。超时是套接字的属性而不是操作的属性,因此无需在每次操作前再次设置。

但是根据文档,Rust 实现了一个完全不同的东西。如果我正确地解释了文档,他们不会为每个操作设置超时,而是为套接字上的所有此类操作设置截止日期。也就是说,当计时器设置为 10 秒时,您可以在这段时间内进行多次读取,但如果 10 秒后仍有读取事件,它将停止。

当使用其他语言处理套接字超时时,这种行为不是预期的行为,看起来 Rust 开发人员对此(实验性)API 有类似的反对意见。在 https://github.com/rust-lang/rust/issues/15802他们建议将这些函数从 set..timeout 重命名为 set..deadline 以使名称反射(reflect)行为。

关于tcp - set_timeout() 在 TcpStream 上究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26560774/

相关文章:

c - Arduino 从服务器问题中得到响应

c++ - boost - ASIO 与 IOStreams TCP

rust - 按键对数组排序时的Rust生命周期问题

unit-testing - 我们可以在箱子之间共享测试工具吗?

windows - 在 Windows 上构建 openssl-sys crate 时出错

c# - 套接字缓冲区大小 : pros and cons of bigger vs smaller

c++ - QNetworkAccessManager,重置 TCP 连接

调用 ASP.NET Web API 时出现 AJAX 504

php - 使 PHP socket_connect 超时

sql - 为什么 Timeout.timeout(sec) 不适用于 activerecord