我有一个线程,维护着一个套接字列表,我想遍历这个列表,看看是否有可读的内容,如果有-就对其进行操作,如果没有-就继续到下一个。问题是,一旦我遇到第一个节点,所有的执行都会停止,直到有数据可读为止。
我正在使用std :: io :: Read :: read(&mut self,buf:&mut [u8])-> Result
来自doc “此函数不提供关于它是否阻止等待数据的任何保证,但如果对象需要阻止读取但无法阻止,则通常会通过Err返回值发出信号。”
深入研究源代码,TcpStream的Read实现是
这句话的意思是“引发了什么”。
最后,调用
在这里,可以看到循环非阻塞读取直到数据被检索或发生错误。
是否有一种方法可以使用
我正在使用std :: io :: Read :: read(&mut self,buf:&mut [u8])-> Result
来自doc “此函数不提供关于它是否阻止等待数据的任何保证,但如果对象需要阻止读取但无法阻止,则通常会通过Err返回值发出信号。”
深入研究源代码,TcpStream的Read实现是
impl Read for TcpStream {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
}
这句话的意思是“引发了什么”。
pub fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
let fd = self.fd();
let dolock = || self.lock_nonblocking();
let doread = |nb| unsafe {
let flags = if nb {c::MSG_DONTWAIT} else {0};
libc::recv(fd,
buf.as_mut_ptr() as *mut libc::c_void,
buf.len() as wrlen,
flags) as libc::c_int
};
read(fd, self.read_deadline, dolock, doread)
}
最后,调用
read<T, L, R>(fd: sock_t, deadline: u64, mut lock: L, mut read: R)
。在这里,可以看到循环非阻塞读取直到数据被检索或发生错误。
是否有一种方法可以使用
TcpStream
强制进行非阻塞读取?