我正在使用 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/