Como percorrer apenas descritores de arquivos ativos do resultado fd_set de select ()?

Então, na minha implementação atual do servidor, atualmente é algo como isto:

  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.

     }
  }

Agora, não limpar o fd_set (usando FD_SET, FD_CLR quando os canais são adicionados / removidos apenas) seria a melhor maneira de fazer as coisa

Minha pergunta é: como você pode percorrer o fd_set após o select (), sem verificar cada membro do conjunto se ele faz parte do conjunto, sem usar o FD_ISSE

Quero dizer, quando você tem 4000 conexões ativas, sempre que houver dados recebidos, o loop acima terá que passar por um potencial de 4000 soquetes antes de chegar ao caminho certo. A complexidade seria n ^ 2 se todos os threads estivessem muito ativos!

questionAnswers(3)

yourAnswerToTheQuestion