Rust 为什么第一个会写信给Mio';接受后的TCP流给出一个;行动将阻止;错误?
使用此代码:Rust 为什么第一个会写信给Mio';接受后的TCP流给出一个;行动将阻止;错误?,rust,mio,Rust,Mio,使用此代码: poll.poll(&mut poll_events, Some(Duration::from_secs(0))); for event in poll_events.iter() { match event.token() { LISTENER_TOKEN => { let (mut stream, addr) = unwrap_or_continue!( listener.accept
poll.poll(&mut poll_events, Some(Duration::from_secs(0)));
for event in poll_events.iter() {
match event.token() {
LISTENER_TOKEN => {
let (mut stream, addr) = unwrap_or_continue!(
listener.accept(),
"Failed to accept incoming connection"
);
unwrap_or_continue!(
stream.write("Hello, world!\n".as_bytes()),
&format!("Failed to write to {}", addr)
);
}
_ => unreachable!()
}
}
其中展开或继续代码>只是在报告错误时对错误执行继续
,我得到以下错误:
写入127.0.0.1:49231失败:操作将被阻止
为什么它会阻塞,套接字刚刚被接受,这是第一次写入?实际上,这有什么关系?您需要编写代码来处理阻塞,否则就没有真正的理由使用MIO。没错,我认为非阻塞套接字上的write()
无法阻塞,但在重新访问write(2)
文档后,这是一个有效的场景。非阻塞套接字无法阻塞-这不是它返回错误告诉您它将阻塞的原因吗。。。而不是像我说的那样阻塞?@Shepmaster,重温Linuxwrite(2)
我发现ewoodblock
是一个有效的错误。以前我不认为这是可能的,因为它似乎没有任何可阻止的内容,因为write(2)
已经可以返回0字节,以防缓冲区已满或其他情况。所以我想我对米奥做了些错事。这里有两个不同的观点。你的主要问题是“为什么在这种情况下它会阻塞”,这是一个足够有效的问题。在评论中,您似乎对非阻塞的工作机制感到惊讶。非阻塞套接字的工作原理是每当写入被阻塞时都返回一个错误。