Прототип для функции выбора
select(int no_of_fd,fd_set read_fds,fd_set write_fds,fd_set expection_condition_fd,const struct timeval *timeout)
Что это такое exception condition fd's
представлять?
Когда эти ФД будут установлены?
Он используется для:
наличие внеполосных данных при SO_OOBINLINE
не включен
обнаружить неблокирующую connect()
сбой в Windows. Если соединение установлено успешно, сокет помещается в write_fds
в противном случае except_fds
вместо. Это задокументировано в MSDN для select()
функция:
Таким образом, сокет будет идентифицирован в определенном наборе, когда select возвращает, если:
readfds:
- Если прослушивание было вызвано, и соединение находится в состоянии ожидания, принять будет успешно.
- Данные доступны для чтения (включая данные OOB, если включен SO_OOBINLINE).
- Соединение было закрыто / сброшено / разорвано.
writefds:
- Если обрабатывается вызов подключения (неблокирующий), соединение успешно установлено.
- Данные могут быть отправлены.
exceptfds:
- При обработке вызова (неблокирующего) попытка подключения не удалась.
- Данные OOB доступны для чтения (только если SO_OOBINLINE отключен).
В случае сбоя вы можете запросить сокет для конкретного кода ошибки, используя getsockopt(SOL_SOCKET, SO_ERROR)
, если нужно.
На некоторых других платформах, таких как Linux, select()
всегда ставит розетку в write_fds
независимо от того, было ли соединение успешным или неудачным, вы должны запросить код ошибки для дифференциации. Это описано на справочной странице Linux для connect(2)
функция:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если соединение или привязка успешны, возвращается ноль. При ошибке возвращается -1, и errno устанавливается соответствующим образом.
…
EINPROGRESS
Разъем неблокируемый, и соединение не может быть установлено немедленно. Можно выбрать (2) или опрос (2) для завершения, выбрав сокет для записи. После того, как select (2) указывает на возможность записи, используйте getsockopt (2) для чтения опции SO_ERROR на уровне SOL_SOCKET, чтобы определить, успешно ли завершено connect () (SO_ERROR равен нулю) или неудачно (SO_ERROR является одним из обычных кодов ошибок, перечисленных здесь, объясняя причина неудачи).
Стандарт называет их errorfds
но не говорит, какие именно ошибки следует сообщать. На практике errorfds
не часто используется для ошибок. Он используется для «исключений», одним из которых являются внеполосные данные, например механизм TCP URG.