public static unsafe SocketError Poll(SafeCloseSocket handle, int microseconds, SelectMode mode, out bool status) { uint* fdSet = stackalloc uint[Interop.Sys.FD_SETSIZE_UINTS]; Interop.Sys.FD_ZERO(fdSet); bool releaseHandle = false; try { handle.DangerousAddRef(ref releaseHandle); int fd = (int)handle.DangerousGetHandle(); Interop.Sys.FD_SET(fd, fdSet); int fdCount = 0; uint* readFds = null; uint* writeFds = null; uint* errorFds = null; switch (mode) { case SelectMode.SelectRead: readFds = fdSet; fdCount = fd + 1; break; case SelectMode.SelectWrite: writeFds = fdSet; fdCount = fd + 1; break; case SelectMode.SelectError: errorFds = fdSet; fdCount = fd + 1; break; } int socketCount = 0; Interop.Error err = Interop.Sys.Select(fdCount, readFds, writeFds, errorFds, microseconds, &socketCount); if (err != Interop.Error.SUCCESS) { status = false; return GetSocketErrorForErrorCode(err); } status = Interop.Sys.FD_ISSET(fd, fdSet); } finally { if (releaseHandle) { handle.DangerousRelease(); } } return SocketError.Success; }