set_timeout()在TcpStream上的具体工作方式是什么?

set_timeout()在TcpStream上的具体工作方式是什么?,tcp,timeout,rust,Tcp,Timeout,Rust,我和你一起工作。我使用的基本结构是: loop { if /* new data in the stream */ { /* handle it */ } /* do a lot of other stuff */ } 因此,set\u timeout()似乎是我所需要的,但我对它的工作原理有点困惑。文件说: 此函数将为此流上的所有阻塞操作(包括读取和写入)设置超时。指定的超时是指向未来的相对时间(以毫秒为单位),在此时间之后,点操作将超时。这意味着必须定期重置超时,以防止超时

我和你一起工作。我使用的基本结构是:

loop {
    if /* new data in the stream */ { /* handle it */ }
    /* do a lot of other stuff */
}
因此,
set\u timeout()
似乎是我所需要的,但我对它的工作原理有点困惑。文件说:

此函数将为此流上的所有阻塞操作(包括读取和写入)设置超时。指定的超时是指向未来的相对时间(以毫秒为单位),在此时间之后,点操作将超时。这意味着必须定期重置超时,以防止超时过期

因此,我希望每次在检查是否有新数据可用之前都必须重置超时,否则我只能在一段时间后执行
Err(timeout)

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


我是不是误解了文件?对我来说,使用这种行为安全吗?

我希望它像套接字超时一样工作,就像大多数操作系统中的套接字属性一样,它可以从具有SO\u timeout或类似功能的编程语言中获得。在这样的套接字超时情况下,每当您在套接字上启动阻塞操作(如读、写、连接)时,计时器就会启动。操作将在时间范围内成功,或者计时器将被触发,操作因超时而失败。超时是套接字的属性,而不是操作的属性,因此无需在每次操作之前再次设置超时

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


当一个用于处理其他语言中的套接字超时时,这种行为不是预期的行为,而且看起来Rust开发人员对这种(实验性)API也有类似的反对意见。在本文中,他们建议将此类函数从
set..timeout
重命名为
set..deadline
,以使名称反映行为

因此,文档显然是错误的,它说必须定期重置
,以防止过期
?文档令人恼火,但看起来他们并没有为单个操作执行超时,而是为一组操作执行最后期限。看编辑后的帖子。好吧,如果一切都被改写,我想我会等着看结果如何。