Не уверен, в чем ваша путаница, но вот объяснение.
fdset - это битовая маска файловых дескрипторов, проиндексированных с нуля (технически я не думаю, что имеет , чтобы бытьбитовая маска, но любая другая реализация была бы ... странной).
Таким образом, fdset может быть чем-то вроде:
Byte 0 Byte 1
+---+---+---+---+---+---+---+---+ +---+---+----+----+----+----+----+----+
|fd0|fd1|fd2|fd3|fd4|fd5|fd6|fd7| |fd8|fd9|fd10|fd11|fd12|fd13|fd14|fd15|
+---+---+---+---+---+---+---+---+ +---+---+----+----+----+----+----+----+
Идея состоит в том, что вы устанавливаете бит для данного fd (дескриптор файла) если вам это интересно.Если вас это не интересует, оставьте бит чистым.
FD_ZERO
удалит все биты, что является хорошей отправной точкой.Затем два вызова FD_SET
установят биты для fd0
(стандартный ввод) и fd<socket>
.
Затем вызов select, использующий этот fdset, вернется, если на стандартном вводе или действии было действиев сокете (действие типа будет зависеть от того, какую позицию параметра вы использовали при передаче fdset в select
. Передача в качестве значения чтения fdset означает, что вы вернетесь, если вы сможете прочитать сокетили что-то обнаружилось при стандартном вводе (например, вы используете клавиатуру).
Это может быть полезно в коде для приложения "чат", так как оно будет ожидать ввода от вас или вашего другана другом конце.
Причина, по которой вам нужно обнулять и заново устанавливать биты в fdset, заключается в том, что select
сам изменяет набор, чтобы указать, какой fd (или fds) обнаружил действиеon.
Пример: если что-то поступило через сокет и ничего не поступило через стандартный ввод, fdset изменился бы на select
, чтобы установить только этот бит. Таким образом, вы можетеиспользуйте FD_ISSET
, чтобы определить, на какие fds вы должны смотреть.
Если, как вы, вероятно, указываете в комментариях, есть нет select
вызовов (или других вызовов, использующихreadfds
) между двумя FD_ZERO()/FD_SET()
последовательностями, тогда да, кажется, что первая не нужна, так как информация будет перезаписана второй.
Без просмотра полного кода или документов архитектурного проекта:-) сложно сказать.