Это не правильно. Вы должны быть в состоянии указать 0 как количество файловых дескрипторов в наборе. На самом деле, я помню, как делал код тайм-аута в первые дни, используя select
без дескрипторов и соответствующим образом установленное значение тайм-аута.
Если он возвращает -1, вам нужно посмотреть на errno
, чтобы увидеть, в чем проблема.
Ах, исходя из вашего комментария, WSAEINVAL
означает WinSock. Это объясняет твои проблемы. Это отвратительный зверь, которого нужно избавить от нашего страдания: -)
На этой странице указано, что вы получите WSAEINVAL
, если значение времени ожидания недопустимо или все три параметра дескриптора равны нулю. Позже говорится, что FD_ZERO
«инициализирует набор нулевым набором». Означает ли этот последний фрагмент, что параметр все еще считается NULL, я не знаю. Предполагая, что ваше время ожидания в порядке (поскольку оно работает, если у вас есть FD в одном из наборов), это, вероятно, так.
Я знаю, что сокеты Беркли различают набор NULL FD (т. Е. NULL-указатель) и пустой набор FD (действительный указатель без набора FD) - WinSock может быть не таким универсальным, особенно если игнорируется и включается только для совместимости с Беркли.
Я подозреваю (хотя я не уверен), что WinSock, вероятно, ожидает, что вы не будете делать то, что пытаетесь сделать. Вполне можно предположить, что вы делаете что-то не так, и вам следует использовать select
только для одного или нескольких сокетов в одном или нескольких наборах FD (поскольку единственное использование для select
без FD - это задержка, а в Windows достаточно лучшие способы сделать задержки).