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 ); } }
void SocketMonitor::processExceptSet( Strategy& strategy, fd_set& exceptSet ) { #ifdef _MSC_VER for ( unsigned i = 0; i < exceptSet.fd_count; ++i ) { int s = exceptSet.fd_array[ i ]; strategy.onError( *this, s ); } #else Sockets::iterator i; Sockets sockets = m_connectSockets; for ( i = sockets.begin(); i != sockets.end(); ++i ) { int s = *i; if ( !FD_ISSET( *i, &exceptSet ) ) continue; strategy.onError( *this, s ); } #endif }