Поделиться через


функция select (winsock2.h)

Функция выбора определяет состояние одного или нескольких сокетов, ожидая при необходимости выполнения синхронного ввода-вывода.

Синтаксис

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
WSANOTINITIALISED
Перед использованием этой функции необходимо выполнить успешный вызов WSAStartup .
WSAEFAULT
Реализация сокетов Windows не смогла выделить необходимые ресурсы для своих внутренних операций или чтения, записи, кромеfds или параметров timeval, не являются частью адресного пространства пользователя.
WSAENETDOWN
Сбой сетевой подсистемы.
WSAEINVAL
WSAEINVAL возвращается, если значение времени ожидания недопустимо или если все три параметра дескриптора являются указателями NULL или допустимыми указателями на пустые fd_set структуры, содержащие сокеты.
WSAEINTR
Блокировка вызова Сокета Windows 1.1 была отменена через WSACancelBlockingCall.
WSAEINPROGRESS
Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAENOTSOCK
Один из наборов дескрипторов содержит запись, которая не является сокетом.

Замечания

Функция выбора используется для определения состояния одного или нескольких сокетов. Для каждого сокета вызывающий объект может запрашивать сведения о состоянии чтения, записи или ошибки. Набор сокетов, для которых запрашивается заданное состояние, указывается структурой fd_set . Сокеты, содержащиеся в структурах fd_set , должны быть связаны с одним поставщиком услуг. В целях этого ограничения сокеты считаются из того же поставщика услуг, если WSAPROTOCOL_INFO структуры , описывающие их протоколы, имеют то же значение providerId . По возвращении структуры обновляются, чтобы отразить подмножество этих сокетов, удовлетворяющих указанному условию. Функция выбора возвращает количество сокетов, удовлетворяющих условиям. Набор макросов предоставляется для управления структурой fd_set . Эти макросы совместимы с теми, которые используются в программном обеспечении Berkeley, но базовое представление совершенно отличается.

Параметр считывает сокеты , которые должны быть проверены для удобочитаемости. Если сокет находится в состоянии прослушивания , он будет помечен как доступный для чтения, если входящий запрос на подключение был получен таким образом, что прием гарантированно будет завершен без блокировки. Для других сокетов возможность чтения означает, что данные очереди доступны для чтения таким образом, что вызов для восстановления, WSARecv, WSARecvFrom или recvfrom гарантированно не блокируется.

Для сокетов, ориентированных на подключение, удобочитаемость также может указывать, что запрос на закрытие сокета был получен от однорангового узла. Если виртуальная цепь была закрыта корректно, и все данные были получены, то ревив возвращается немедленно с нулевыми байтами, считываемыми. Если виртуальный канал был сброшен, вычислите сообщение об ошибке сразу же с кодом ошибки, например WSAECONNRESET. Наличие данных OOB будет проверяться, включен ли параметр сокета SO_OOBINLINE (см. раздел <a0/>).

Параметр writefds определяет сокеты, которые должны быть проверены для записи. Если сокет обрабатывает вызов подключения (неблокировка), сокет можно записать, если установка подключения успешно завершена. Если сокет не обрабатывает вызов подключения , возможность записи означает , что отправка, sendto или WSASendto гарантируется успешно. Однако они могут блокировать сокет блокировки, если параметр len превышает доступное пространство исходящего буфера системы. Не указано, сколько времени эти гарантии могут быть допустимыми, особенно в многопоточной среде.

Параметр , кромеfds , определяет сокеты, которые должны быть проверены на наличие данных OOB или каких-либо исключительных условий ошибки.

Примечание Данные вне диапазона будут сообщаться только таким образом, если параметр SO_OOBINLINE имеет значение FALSE. Если сокет обрабатывает вызов подключения (неблокирование), ошибка попытки подключения указывается в за исключениемfds (приложение должно вызывать метод getsockopt SO_ERROR, чтобы определить значение ошибки, чтобы описать, почему произошел сбой). Этот документ не определяет, какие другие ошибки будут включены.
 
Любой из двух параметров, readfds, writefds или exceptfds можно указать как null. По крайней мере один должен быть ненулевым, и любой набор дескрипторов, отличных от NULL , должен содержать по крайней мере один дескриптор сокета.

В итоге сокет будет определен в определенном наборе при выборе , если:

readfds:

  • Если вызов прослушивания и подключение ожидается, примите успешно.
  • Данные доступны для чтения (включая данные OOB, если SO_OOBINLINE включен).
  • Подключение закрыто, сброс и завершение работы.
writefds:
  • При обработке вызова подключения (неблокировки) подключение выполнено успешно.
  • Данные можно отправлять.
кромеfds:
  • При обработке вызова подключения (неблокировки) попытка подключения завершилась ошибкой.
  • Данные OOB доступны для чтения (только если SO_OOBINLINE отключены).
Четыре макроса определяются в файле заголовка Winsock2.h для управления и проверки наборов дескрипторов. Переменная FD_SETSIZE определяет максимальное количество дескрипторов в наборе. (Значение по умолчанию FD_SETSIZE равно 64, которое можно изменить, определив FD_SETSIZE на другое значение, прежде чем включить Winsock2.h.) Внутри системы дескриптор сокетов в структуре fd_set не представлен как битовые флаги, как и в Berkeley Unix. Их представление данных непрозрачно. Использование этих макросов будет поддерживать переносимость программного обеспечения между разными средами сокетов. Макросы для управления и проверки содержимого fd_set :
  • FD_ZERO(*set) — инициализирует пустой набор. Перед использованием всегда следует очистить набор.
  • FD_CLR, *set) — удаляет сокеты из набора.
  • FD_ISSET, *set) — проверяет, является ли s членом набора и возвращает значение TRUE, если да.
  • FD_SET, *set) — добавляет сокеты для задания.

Время ожидания параметра определяет, сколько времени может занять выборка. Если время ожидания является пустым указателем, выберите блокировку на неопределенный срок до тех пор, пока хотя бы один дескриптор не соответствует указанным критериям. В противном случае время ожидания указывает на структуру TIMEVAL , указывающую максимальное время, которое следует выбрать перед возвратом. При выборе значения содержимое структуры TIMEVAL не изменяется. Если TIMEVAL инициализируется в {0, 0}, выберите немедленное возвращение; используется для опроса состояния выбранных сокетов. Если выбор возвращается немедленно, вызов выбора считается неблокировным, а стандартные предположения о неблокировке вызовов применяются. Например, блокировка не будет вызываться, и сокеты Windows не будут давать.

Примечание Функция select не влияет на сохраняемость событий сокета, зарегистрированных в WSAAsyncSelect или WSAEventSelect.
 
Примечание При выполнении блокирующего вызова Winsock, например выбора с параметром тайм-аута , заданного значение NULL, Winsock может потребоваться ждать сетевого события до завершения вызова. Winsock выполняет оповещенное ожидание в этой ситуации, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в одном потоке. Выдача другого блокирующего вызова Winsock внутри APC, который прервал текущий блокирующий вызов Winsock в том же потоке приведет к неопределенному поведению и никогда не должен пытаться клиентами Winsock.
 
Windows Phone 8: Эта функция поддерживается для приложений Магазина Windows Phone в Windows Phone 8 и более поздних версиях.

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

См. также

TIMEVAL

WSASyncSelect

WSAEventSelect

Функции Winsock

Справочник по Winsock

принять

connect

recv

recvfrom

Отправить