Allow non-blocking Read to check socket status


#1

The way to determine if a socket has been closed is to perform a read or write on it. However, without being able to do a non-blocking read, it’s not possible to check the status without blocking. There is a ErrorKind::WouldBlock, which at first led me to think this might be possible.

I’m not asking for full async IO. Just to be able to try a possible read that isn’t blocking. Take an example ConnectionPool, which wants to check that a pooled connection is still alive before returning it:

fn get(addr: SocketAddr) -> TcpStream {
    if let Some(ref mut pooled) = self.conns.find(&addr) {
        while let Some(mut conn) = pooled.pop() {
            match conn.read_nonblocking(&[]) {
                Ok(..) => return conn,
                Err(e) if e.kind() == ErrorKind::WouldBlock => return conn,
                Err(..) => continue
            }
        }
    }
    // all dead, TcpStream::connect() a new one
}

Pre-RFC: std::net expansion/refinement