Итак, в моей текущей реализации сервера это сейчас примерно так:
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.
}
}
Теперь, не очищая fd_set (используя FD_SET, FD_CLR, когда каналы только добавлено / удалено) было бы лучше.
Мой вопрос в том, как можно выполнить цикл через fd_set после select (), без проверки каждого члена набора, если он является частью набора, без использования FD_ISSET?
Я имею в виду, когда у вас 4000 активных соединений, всякий раз, когда есть входящие данные, вышеуказанный цикл должен будет пройти через потенциал 4000 сокетов, прежде чем добраться до нужного. Сложность будет n ^ 2, если все потоки активны много!