правильная обработка дескрипторов после select
Есть tcp сокет сервер. К нему может подключиться неограниченное количество клиентов. После всех подключений дескриптор каждого подключения заносится в fd_set readfds
, вызывается select(n, &readfds, NULL,NULL,NULL);
Вопрос: select
вызывается в цикле, что делать если в readfds
после возврата из select
будет несколько дескрипторов? Обработать один и идти на следующую итерацию основного цикла или обработать все имеющиеся? Вот 2 кода, для них есть общий односвязный список(fds) с дескрипторами, правильно 1 или 2 вариант?:
1: то есть тут мы обработаем все дескрипторы с которых пришли данные
select(n, &readfds, NULL, NULL, NULL);
for (f = fds; f; f = f->next) {
if (FD_ISSET(f->fd, &readfds)) {
*что-то далаем*
}
}
2: а тут один
select(n, &readfds, NULL, NULL, NULL);
for (f = fds; f; f = f->next) {
if (FD_ISSET(f->fd, &readfds)) {
*что-то далаем*;
break; // выход из этого цикла после первого ответа и возврат к основному циклу
}
}
По теории (как я понял): возврат в основной цикл делаем после одного ответа, в таком случае правильным будет код под номером 2, я его и придерживаюсь, это логично, что бы мы сразу могли принять соединение следующего клиента и не образовывалась очередь. Но вдруг я ошибаюсь. Извините если банальнища какая-то, я изучаю и меня интересуют все нюансы.