Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция выбора определяет состояние одного или нескольких сокетов, ожидая при необходимости выполнения синхронного ввода-вывода.
Синтаксис
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 включен только для совместимости со сокетами Berkeley.
[in, out] readfds
Необязательный указатель на набор сокетов, который необходимо проверить на удобочитаемость.
[in, out] writefds
Необязательный указатель на набор сокетов, который необходимо проверить на возможность записи.
[in, out] exceptfds
Необязательный указатель на набор сокетов для проверки ошибок.
[in] timeout
Максимальное время ожидания выбора , предоставленное в виде структуры TIMEVAL . Задайте для параметра тайм-аутазначение NULL для блокирующих операций.
Возвращаемое значение
Функция выбора возвращает общее количество дескрипторов сокетов, которые готовы и содержатся в структурах fd_set , ноль, если истек срок действия или SOCKET_ERROR, если произошла ошибка. Если возвращаемое значение SOCKET_ERROR, можно использовать WSAGetLastError для получения определенного кода ошибки.
| Код ошибки | Meaning |
|---|---|
| Перед использованием этой функции необходимо выполнить успешный вызов WSAStartup . | |
| Реализация сокетов Windows не смогла выделить необходимые ресурсы для своих внутренних операций или чтения, записи, кромеfds или параметров timeval, не являются частью адресного пространства пользователя. | |
| Сбой сетевой подсистемы. | |
| WSAEINVAL возвращается, если значение времени ожидания недопустимо или если все три параметра дескриптора являются указателями NULL или допустимыми указателями на пустые fd_set структуры, содержащие сокеты. | |
| Блокировка вызова Сокета Windows 1.1 была отменена через WSACancelBlockingCall. | |
| Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
| Один из наборов дескрипторов содержит запись, которая не является сокетом. |
Замечания
Функция выбора используется для определения состояния одного или нескольких сокетов. Для каждого сокета вызывающий объект может запрашивать сведения о состоянии чтения, записи или ошибки. Набор сокетов, для которых запрашивается заданное состояние, указывается структурой fd_set . Сокеты, содержащиеся в структурах fd_set , должны быть связаны с одним поставщиком услуг. В целях этого ограничения сокеты считаются из того же поставщика услуг, если WSAPROTOCOL_INFO структуры , описывающие их протоколы, имеют то же значение providerId . По возвращении структуры обновляются, чтобы отразить подмножество этих сокетов, удовлетворяющих указанному условию. Функция выбора возвращает количество сокетов, удовлетворяющих условиям. Набор макросов предоставляется для управления структурой fd_set . Эти макросы совместимы с теми, которые используются в программном обеспечении Berkeley, но базовое представление совершенно отличается.
Параметр считывает сокеты , которые должны быть проверены для удобочитаемости. Если сокет находится в состоянии прослушивания , он будет помечен как доступный для чтения, если входящий запрос на подключение был получен таким образом, что прием гарантированно будет завершен без блокировки. Для других сокетов возможность чтения означает, что данные очереди доступны для чтения таким образом, что вызов для восстановления, WSARecv, WSARecvFrom или recvfrom гарантированно не блокируется.
Для сокетов, ориентированных на подключение, удобочитаемость также может указывать, что запрос на закрытие сокета был получен от однорангового узла. Если виртуальная цепь была закрыта корректно, и все данные были получены, то ревив возвращается немедленно с нулевыми байтами, считываемыми. Если виртуальный канал был сброшен, вычислите сообщение об ошибке сразу же с кодом ошибки, например WSAECONNRESET. Наличие данных OOB будет проверяться, включен ли параметр сокета SO_OOBINLINE (см.
Параметр writefds определяет сокеты, которые должны быть проверены для записи. Если сокет обрабатывает вызов подключения (неблокировка), сокет можно записать, если установка подключения успешно завершена. Если сокет не обрабатывает вызов подключения , возможность записи означает , что отправка, sendto или WSASendto гарантируется успешно. Однако они могут блокировать сокет блокировки, если параметр len превышает доступное пространство исходящего буфера системы. Не указано, сколько времени эти гарантии могут быть допустимыми, особенно в многопоточной среде.
Параметр , кромеfds , определяет сокеты, которые должны быть проверены на наличие данных OOB или каких-либо исключительных условий ошибки.
В итоге сокет будет определен в определенном наборе при выборе , если:
readfds:
- Если вызов прослушивания и подключение ожидается, примите успешно.
- Данные доступны для чтения (включая данные OOB, если SO_OOBINLINE включен).
- Подключение закрыто, сброс и завершение работы.
- При обработке вызова подключения (неблокировки) подключение выполнено успешно.
- Данные можно отправлять.
- При обработке вызова подключения (неблокировки) попытка подключения завершилась ошибкой.
- Данные OOB доступны для чтения (только если SO_OOBINLINE отключены).
- FD_ZERO(*set) — инициализирует пустой набор. Перед использованием всегда следует очистить набор.
- FD_CLR, *set) — удаляет сокеты из набора.
- FD_ISSET, *set) — проверяет, является ли s членом набора и возвращает значение TRUE, если да.
- FD_SET, *set) — добавляет сокеты для задания.
Время ожидания параметра определяет, сколько времени может занять выборка. Если время ожидания является пустым указателем, выберите блокировку на неопределенный срок до тех пор, пока хотя бы один дескриптор не соответствует указанным критериям. В противном случае время ожидания указывает на структуру TIMEVAL , указывающую максимальное время, которое следует выбрать перед возвратом. При выборе значения содержимое структуры TIMEVAL не изменяется. Если TIMEVAL инициализируется в {0, 0}, выберите немедленное возвращение; используется для опроса состояния выбранных сокетов. Если выбор возвращается немедленно, вызов выбора считается неблокировным, а стандартные предположения о неблокировке вызовов применяются. Например, блокировка не будет вызываться, и сокеты 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] |
| целевая платформа | Виндоус |
| Header | winsock2.h |
| Library | Ws2_32.lib |
| DLL | Ws2_32.dll |