Select устанавливает бит, соответствующий дескриптору файла в наборе, поэтому вам не нужно перебирать все fds, если вас интересуют только некоторые (и могут игнорировать другие), просто протестируйте только те файловые дескрипторы, для которых Вы заинтересованы.
if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(4);
}
if(FD_ISSET(fd0, &read_fds))
{
//do things
}
if(FD_ISSET(fd1, &read_fds))
{
//do more things
}
EDIT
Вот структура fd_set:
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;
Где, fd_count - это количество установленных сокетов (так что вы можете добавить оптимизацию, используя это), а fd_array - битовый вектор (размера FD_SETSIZE * sizeof (int) , который зависит от машины ). В моей машине это 64 * 64 = 4096.
Итак, ваш вопрос по сути: каков наиболее эффективный способ найти позиции битов в 1 с в битовом векторе (размером около 4096 бит)?
Я хочу прояснить одну вещь:
«прохождение через все подключенные сокеты» не означает, что вы на самом деле читаете / делаете что-то для соединения. FD_ISSET () только проверяет, установлен или нет бит в наборе fd_set, установленном на присвоенный номер соединения file_descriptor соединения. Если ваша цель - эффективность, то не самая ли это эффективная? используя эвристику?
Пожалуйста, расскажите нам, что не так с этим методом, и что вы пытаетесь достичь с помощью альтернативного метода.