我正在使用TcpStream
。我使用的基本结构是:
loop {
if /* new data in the stream */ { /* handle it */ }
/* do a lot of other stuff */
}
所以set_timeout()
似乎是我需要的,但我对它的工作方式有点困惑。文件上写着:
此函数将为此流上的所有阻塞操作(包括读取和写入)设置超时。指定的超时是一个相对时间(以毫秒为单位),在该时间之后,点操作将超时。这意味着必须定期重置超时以防止其过期。
因此,在检查是否有新数据可用之前,我希望每次都必须重置超时,否则一段时间后我只会有Err(TimeOut)
。
但事实并非如此:事实上,如果我一次性设置一个非常低的超时(比如10毫秒),循环就会完全按照我的意愿进行。如果有,则返回新数据;如果没有,则返回Err(TimeOut)
。
我是不是误解了文件?我使用这种行为安全吗?
我本希望它能像套接字超时一样工作,就像大多数操作系统中套接字的属性一样,并且可以从带有SO_timeout或类似功能的编程语言中获得。有了这样的套接字超时,每当您在套接字上启动阻塞操作(如读取、写入、连接)时,计时器就会启动。操作将在时间范围内成功,或者计时器将被触发,操作因超时而失败。超时是套接字的属性,而不是操作的属性,因此无需在每次操作之前再次设置超时。
但根据文件Rust实现了一个完全不同的东西。如果我正确解释了文档,它们不会为每个操作设置超时,而是为套接字上的所有此类操作设置截止日期。也就是说,当计时器设置为10秒时,您可以在这段时间内进行多次读取,但如果10秒后仍有读取活动,则会停止读取。
当在其他语言中使用套接字超时时,这种行为不是预期的行为,而且Rust开发人员似乎对这种(实验性的)API有类似的反对意见。在里面https://github.com/rust-lang/rust/issues/15802他们建议将这类函数从CCD_ 5重命名为CCD_。