void SocketMonitor::block( Strategy& strategy, bool poll, double timeout ) { while ( m_dropped.size() ) { strategy.onError( *this, m_dropped.front() ); m_dropped.pop(); if ( m_dropped.size() == 0 ) return ; } fd_set readSet; FD_ZERO( &readSet ); buildSet( m_readSockets, readSet ); fd_set writeSet; FD_ZERO( &writeSet ); buildSet( m_connectSockets, writeSet ); buildSet( m_writeSockets, writeSet ); fd_set exceptSet; FD_ZERO( &exceptSet ); buildSet( m_connectSockets, exceptSet ); if ( sleepIfEmpty(poll) ) { strategy.onTimeout( *this ); return; } int result = select( FD_SETSIZE, &readSet, &writeSet, &exceptSet, getTimeval(poll, timeout) ); if ( result == 0 ) { strategy.onTimeout( *this ); return; } else if ( result > 0 ) { processExceptSet( strategy, exceptSet ); processWriteSet( strategy, writeSet ); processReadSet( strategy, readSet ); } else { strategy.onError( *this ); } }