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


Функция 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 .

Код ошибки Значение
WSANOTINITIALISED
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup .
WSAEFAULT
Реализации сокетов Windows не удалось выделить необходимые ресурсы для внутренних операций, либо параметры readfds, writefds, exceptfds или timeval не являются частью адресного пространства пользователя.
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEINVAL
Недопустимое значение времени ожидания , или все три параметра дескриптора имеют значение NULL.
WSAEINTR
Блокирующий вызов сокета Windows 1.1 был отменен через WSACancelBlockingCall.
WSAEINPROGRESS
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAENOTSOCK
Один из наборов дескрипторов содержит запись, которая не является сокетом.

Комментарии

Функция 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 или любых исключительных условий ошибок.

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

Таким образом, сокет будет определен в определенном наборе, когда функция select возвращает значение , если:

readfds:

  • Если была вызвана служба прослушивания и подключение находится в состоянии ожидания, принять будет успешно.
  • Данные доступны для чтения (включая данные OOB, если SO_OOBINLINE включен).
  • Подключение было закрыто, сброшено или прервано.
writefds:
  • При обработке вызова подключения (неблокировка) подключение выполнено успешно.
  • Данные можно отправлять.
exceptfds:
  • При обработке вызова подключения (неблокировка) попытка подключения завершилась сбоем.
  • Данные 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(s, *set) — удаляет сокеты из набора.
  • FD_ISSET, *set) — проверяет, является ли s членом набора, и возвращает значение TRUE.
  • FD_SET(s, *set) — добавляет сокеты в набор.

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

Примечание Функция select не влияет на сохранение событий сокета, зарегистрированных с помощью WSAsyncSelect или WSAEventSelect.
 
Примечание При выполнении блокирующего вызова Winsock, например select с параметром времени ожидания , равным 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]
Целевая платформа Windows
Header winsock2.h
Библиотека Ws2_32.lib
DLL Ws2_32.dll

См. также раздел

TIMEVAL

WSAsyncSelect

WSAEventSelect

Функции Winsock

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

Принять

connect;

Recv

recvfrom

send