¿Cómo recorrer solo los descriptores de archivos activos del resultado fd_set de select ()?

Así que en mi implementación actual del servidor, actualmente es algo como esto:

  void loop(){
     // step 1: clear set

     fd_set readfds;

     while(true){

        // step 1:
        FD_ZERO(readfds);

        // step 2:
        loop_through_sockets_and_add_active_sockets_to(theset);

        // step 3:
        switch(select(FD_SETSIZE, &readfds, 0, 0, &tv)) {
           case SOCKET_ERROR:
              patia->receiveEvent(Error, net::getError());
              return;
           case 0:
              return;
        }

        // step 4:
        loop through sockets and check, using FD_ISSET, 
        which read fd's have incoming data.

     }
  }

Ahora, no borrar el fd_set (usando FD_SET, FD_CLR cuando solo se agregan / eliminan los canales) sería una mejor manera de hacer las cosas.

Mi pregunta es, ¿cómo puede recorrer fd_set después de select (), sin verificar cada miembro del conjunto si es parte del conjunto, sin usar FD_ISSET?

Quiero decir, cuando tienes 4000 conexiones activas, cada vez que hay datos entrantes, el bucle anterior tendrá que pasar por un potencial de 4000 sockets antes de llegar al correcto. ¡La complejidad sería n ^ 2 si todos los hilos están activos mucho!

Respuestas a la pregunta(3)

Su respuesta a la pregunta