правильная обработка дескрипторов после select

Рейтинг: 1Ответов: 0Опубликовано: 23.03.2023

Есть 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, я его и придерживаюсь, это логично, что бы мы сразу могли принять соединение следующего клиента и не образовывалась очередь. Но вдруг я ошибаюсь. Извините если банальнища какая-то, я изучаю и меня интересуют все нюансы.

Ответы

Ответов пока нет.