Функция select (winsock2.h)
Функция select определяет состояние одного или нескольких сокетов, ожидающих при необходимости выполнения синхронного ввода-вывода.
Синтаксис
int WSAAPI select(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout
);
Параметры
[in] nfds
Не обрабатывается. Параметр nfds включен только для совместимости с сокетами Беркли.
[in, out] readfds
Необязательный указатель на набор сокетов для проверки удобочитаемости.
[in, out] writefds
Необязательный указатель на набор сокетов, которые необходимо проверить на возможность записи.
[in, out] exceptfds
Необязательный указатель на набор сокетов для проверки на наличие ошибок.
[in] timeout
Максимальное время ожидания выбора , предоставленное в виде структуры TIMEVAL . Присвойте параметру времени ожиданиязначение NULL для блокирующих операций.
Возвращаемое значение
Функция select возвращает общее количество дескрипторов сокетов, которые готовы и содержатся в структурах fd_set , ноль, если истек срок действия ограничения, или SOCKET_ERROR, если произошла ошибка. Если возвращаемое значение равно SOCKET_ERROR, для получения определенного кода ошибки можно использовать WSAGetLastError .
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup . | |
Реализации сокетов Windows не удалось выделить необходимые ресурсы для внутренних операций, либо параметры readfds, writefds, exceptfds или timeval не являются частью адресного пространства пользователя. | |
Произошел сбой сетевой подсистемы. | |
Недопустимое значение времени ожидания , или все три параметра дескриптора имеют значение NULL. | |
Блокирующий вызов сокета Windows 1.1 был отменен через WSACancelBlockingCall. | |
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Один из наборов дескрипторов содержит запись, которая не является сокетом. |
Комментарии
Функция select используется для определения состояния одного или нескольких сокетов. Для каждого сокета вызывающий объект может запрашивать сведения о состоянии чтения, записи или ошибки. Набор сокетов, для которых запрашивается заданное состояние, обозначается структурой fd_set . Сокеты, содержащиеся в структурах fd_set , должны быть связаны с одним поставщиком услуг. Для целей этого ограничения сокеты считаются от одного поставщика услуг, если структуры WSAPROTOCOL_INFO , описывающие их протоколы, имеют одно и то же значение providerId . По возвращении структуры обновляются, чтобы отразить подмножество этих сокетов, удовлетворяющих указанному условию. Функция select возвращает количество сокетов, соответствующих условиям. Для управления структурой fd_set предоставляется набор макросов. Эти макросы совместимы с теми, которые используются в программном обеспечении Беркли, но базовое представление полностью отличается.
Параметр readfds определяет сокеты, которые необходимо проверить на удобочитаемость. Если сокет в настоящее время находится в состоянии прослушивания , он будет помечен как доступный для чтения, если входящий запрос на подключение был получен таким образом, что прием гарантированно завершится без блокировки. Для других сокетов удобочитаемость означает, что данные в очереди доступны для чтения таким образом, что вызов recv, WSARecv, WSARecvFrom или recvfrom гарантированно не блокируется.
Для сокетов, ориентированных на подключение, удобочитаемость также может указывать на то, что запрос на закрытие сокета получен от однорангового узла. Если виртуальная цепь была корректно закрыта, а все данные получены, то функция recv будет немедленно возвращена с нулевым числом прочитанных байтов. Если виртуальная цепь была сброшена, функция recv будет немедленно завершена с кодом ошибки, например WSAECONNRESET. Наличие данных OOB проверяется, если включен параметр сокета SO_OOBINLINE (см. раздел setsockopt).
Параметр writefds определяет сокеты, которые необходимо проверить на возможность записи. Если сокет обрабатывает вызов подключения (неблокирует), сокет может быть доступен для записи в случае успешного завершения подключения. Если сокет не обрабатывает вызов подключения , возможность записи означает, что отправка, отправка или WSASendto гарантированы. Однако они могут блокировать блокирующие сокеты, если параметр len превышает объем доступного буфера исходящей системы. Не указано, как долго эти гарантии могут считаться действительными, особенно в многопоточной среде.
Параметр exceptfds определяет сокеты, которые должны проверяться на наличие данных OOB или любых исключительных условий ошибок.
Таким образом, сокет будет определен в определенном наборе, когда функция select возвращает значение , если:
readfds:
- Если была вызвана служба прослушивания и подключение находится в состоянии ожидания, принять будет успешно.
- Данные доступны для чтения (включая данные OOB, если SO_OOBINLINE включен).
- Подключение было закрыто, сброшено или прервано.
- При обработке вызова подключения (неблокировка) подключение выполнено успешно.
- Данные можно отправлять.
- При обработке вызова подключения (неблокировка) попытка подключения завершилась сбоем.
- Данные OOB доступны для чтения (только если SO_OOBINLINE отключен).
- FD_ZERO(*set) — инициализирует пустой набор. Набор всегда должен быть очищен перед использованием.
- FD_CLR(s, *set) — удаляет сокеты из набора.
- FD_ISSET, *set) — проверяет, является ли s членом набора, и возвращает значение TRUE.
- FD_SET(s, *set) — добавляет сокеты в набор.
Время ожидания параметра определяет, сколько времени может занять выбор . Если время ожидания равно пустому указателю, select будет блокироваться на неопределенный срок, пока по крайней мере один дескриптор не будет соответствовать указанным условиям. В противном случае время ожидания указывает на структуру TIMEVAL , указывающую максимальное время, которое следует ждать перед возвратом. При возврате значения select содержимое структуры TIMEVAL не изменяется. Если параметр TIMEVAL инициализируется в {0, 0}, выбор возвращается немедленно; используется для опроса состояния выбранных сокетов. Если функция select возвращается немедленно, вызов select считается неблокировным и применяются стандартные допущения для неблокированных вызовов. Например, блокирующий перехватчик не будет вызываться, а сокеты Windows не будут возвращать.
Windows 8.1 и Windows Server 2012 R2. Эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Требования
Минимальная версия клиента | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | winsock2.h |
Библиотека | Ws2_32.lib |
DLL | Ws2_32.dll |