Как использовать функцию select() в программировании сокетов?
-
21-08-2019 - |
Вопрос
Прототип:
int select (int nfds,
fd_set *read-fds,
fd_set *write-fds,
fd_set *except-fds,
struct timeval *timeout);
Я довольно долго пытался понять эту функцию.Мой вопрос: если он проверяет все файловые дескрипторы от 0 до nfds-1 и при возврате изменяет read-fds, write-fds и кроме-fds, почему мне нужно использовать FD_SET для добавления файловых дескрипторов в набор в начале он все равно проверит все файловые дескрипторы или нет?
Решение
Он не будет проверять от 0 до nfds
-1.Первый аргумент просто предоставляет верхнюю границу размера используемых файловых дескрипторов.Это связано с тем, что сам набор может быть представлен как битовый вектор, без возможности узнать, сколько бит на самом деле используется.Указание этого в качестве отдельного аргумента помогает select()
избегайте проверки файловых дескрипторов, которые не используются.
Кроме того, дескриптор, которого нет, например.чтение установлено при вызове select()
вообще не проверяется, поэтому он не может появиться в наборе и при возврате вызова.
Другие советы
Когда-то у меня было такое же сомнение, как и у тебя.Вы можете посмотреть следующие вопросы и ответы: