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,重温Linux
write(2)
我发现
ewoodblock
是一个有效的错误。以前我不认为这是可能的,因为它似乎没有任何可阻止的内容,因为
write(2)
已经可以返回0字节,以防缓冲区已满或其他情况。所以我想我对米奥做了些错事。这里有两个不同的观点。你的主要问题是“为什么在这种情况下它会阻塞”,这是一个足够有效的问题。在评论中,您似乎对非阻塞的工作机制感到惊讶。非阻塞套接字的工作原理是每当写入被阻塞时都返回一个错误。