Socket Select с пустым набором fd - PullRequest
2 голосов
/ 08 апреля 2010

Предположим, у вас есть набор fd, в котором может быть ноль или более сокетов. Когда я пытаюсь вызвать операцию выбора для пустого набора fd, то получаю -1 как число установленных fds, что означает ошибку. Итак, что бы вы предложили, чтобы преодолеть эту проблему, вы можете сказать, не вызывать, если пусто, но у меня есть цикл, и каждый раз, когда набор fd может содержать 0 или более сокетов. Каков наилучший подход к этой проблеме? (мы на языке программирования C)

Ответы [ 3 ]

6 голосов
/ 08 апреля 2010

Это не правильно. Вы должны быть в состоянии указать 0 как количество файловых дескрипторов в наборе. На самом деле, я помню, как делал код тайм-аута в первые дни, используя select без дескрипторов и соответствующим образом установленное значение тайм-аута.

Если он возвращает -1, вам нужно посмотреть на errno, чтобы увидеть, в чем проблема.


Ах, исходя из вашего комментария, WSAEINVAL означает WinSock. Это объясняет твои проблемы. Это отвратительный зверь, которого нужно избавить от нашего страдания: -)

На этой странице указано, что вы получите WSAEINVAL, если значение времени ожидания недопустимо или все три параметра дескриптора равны нулю. Позже говорится, что FD_ZERO «инициализирует набор нулевым набором». Означает ли этот последний фрагмент, что параметр все еще считается NULL, я не знаю. Предполагая, что ваше время ожидания в порядке (поскольку оно работает, если у вас есть FD в одном из наборов), это, вероятно, так.

Я знаю, что сокеты Беркли различают набор NULL FD (т. Е. NULL-указатель) и пустой набор FD (действительный указатель без набора FD) - WinSock может быть не таким универсальным, особенно если игнорируется и включается только для совместимости с Беркли.

Я подозреваю (хотя я не уверен), что WinSock, вероятно, ожидает, что вы не будете делать то, что пытаетесь сделать. Вполне можно предположить, что вы делаете что-то не так, и вам следует использовать select только для одного или нескольких сокетов в одном или нескольких наборах FD (поскольку единственное использование для select без FD - это задержка, а в Windows достаточно лучшие способы сделать задержки).

1 голос
/ 08 апреля 2010

В Windows функция select полностью игнорирует аргумент nfds.Я не могу проверить это в настоящее время, но возможно, что возвращается ошибка, если все наборы не NULL, а пустые.

Чтобы обойти это, вы можете либо полностью пропустить выбор, либо оставить фиктивный сокетчтобы убедиться, что в наборе всегда есть хотя бы одна розетка.

0 голосов
/ 08 апреля 2010

Пожалуйста, прочитайте справку select .В нем говорится, что WSAEINVAL будет возвращено, если «значение времени ожидания недопустимо или все три параметра дескриптора были нулевыми»,Очевидно, что вы также передаете неправильное значение тайм-аута.Таким образом, укажите правильное значение тайм-аута, если хотите использовать с 0 дескрипторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...