Допустим, у меня есть серверная программа, которая может принимать соединения от 10 (или более) разных клиентов. Клиенты отправляют данные случайным образом, которые получает сервер, но точно известно, что по крайней мере один клиент будет отправлять данные при каждом обновлении. Сервер не может ждать поступления информации, потому что у него есть другая обработка. Помимо использования асинхронных сокетов, я вижу два варианта:
Сделать все сокеты неблокирующими. В цикле вызовите
recv()
для каждого сокета и разрешите ему сбой сWSAEWOULDBLOCK
, если нет доступных данных, и если я получу некоторые данные, то сохраните их.Оставьте сокеты блокирующими. Добавьте все сокеты в
FD_SET
и вызовитеselect()
. Если возвращаемое значение не равно нулю (что и будет в большинстве случаев), выполните цикл по всем сокетам, чтобы найти соответствующее количество читаемых сокетов сFD_ISSET()
, и вызовитеrecv()
только для читаемых сокетов.
Первый вариант создаст намного больше вызовов функции recv()
. Второй метод представляет собой большую боль с точки зрения программирования из-за всех циклов FD_SET
и FD_ISSET
.
Какой метод (или другой метод) предпочтительнее? Стоит ли избегать накладных расходов, связанных с отказом recv()
на неблокирующем сокете, хлопот с вызовом select()
?
Я думаю, что понимаю оба метода, и я успешно пробовал оба, но я не знаю, считается ли один из них лучшим или оптимальным.