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


Функция обратного вызова LPWSPSELECT (ws2spi.h)

Функция LPWSPSelect определяет состояние одного или нескольких сокетов.

Синтаксис

LPWSPSELECT Lpwspselect;

int Lpwspselect(
  [in]      int nfds,
  [in, out] fd_set *readfds,
  [in, out] fd_set *writefds,
  [in, out] fd_set *exceptfds,
  [in]      const timeval *timeout,
  [out]     LPINT lpErrno
)
{...}

Параметры

[in] nfds

Игнорируется и включается только ради совместимости.

[in, out] readfds

Необязательный указатель на набор сокетов для проверки удобочитаемости.

[in, out] writefds

Необязательный указатель на набор сокетов, которые необходимо проверить на возможность записи.

[in, out] exceptfds

Необязательный указатель на набор сокетов для проверки ошибок.

[in] timeout

Максимальное время ожидания LPWSPSelect или null для блокирующей операции в виде временных значений структуры.

[out] lpErrno

Указатель на код ошибки.

Возвращаемое значение

Функция LPWSPSelect возвращает общее количество дескрипторов, готовых и содержащихся в структурах fd_set, или SOCKET_ERROR, если произошла ошибка. Если возвращаемое значение SOCKET_ERROR, определенный код ошибки доступен в lpErrno.

Код ошибки Значение
WSAEFAULT
Поставщик служб сокетов Windows не смог выделить необходимые ресурсы для внутренних операций или считывания, записи, кроме или параметров времени не являются частью адресного пространства пользователя.
WSAENETDOWN
Сбой сетевой подсистемы.
WSAEINVAL
Недопустимое значение времени ожидания или все три параметра дескриптора были NULL.
WSAEINTR
Вызов (блокировка) был отменен через LPWSPCancelBlockingCall.
WSAEINPROGRESS
Блокировка вызова сокетов Windows выполняется или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAENOTSOCK
Один из наборов дескрипторов содержит запись, которая не является сокетом.

Замечания

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

Параметр readfds определяет эти сокеты, которые необходимо проверить для удобочитаемости. Если сокет в настоящее время прослушивается через LPWSPListen, он будет помечен как доступный для чтения, если был получен входящий запрос на подключение, чтобы LPWSPAccept гарантированно завершить работу без блокировки. Для других сокетов возможность чтения означает, что данные очереди доступны для чтения, чтобы LPWSPRecv или LPWSPRecvFrom гарантированно не блокировать.

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

Параметр записи определяет эти сокеты, которые необходимо проверить на наличие записи:

  • Если сокет подключается через LPWSPConnect, возможность записи означает, что создание подключения успешно завершено.
  • Если сокет не находится в процессе прослушивания через LPWSPConnect, возможность записи означает, что LPWSPSend или LPWSPSendTo гарантировано успешно.

Однако они могут блокировать сокет блокировки, если len превышает доступное пространство исходящего буфера системы. Не указано, сколько времени эти гарантии могут быть допустимыми, особенно в многопоточной среде.

Параметр кромеfds определяет эти сокеты, которые необходимо проверить на наличие данных OOB или каких-либо исключительных условий ошибки. Обратите внимание, что данные OOB будут сообщаться только таким образом, если параметр SO_OOBINLINE FALSE. Если сокет делает подключение LPWSPConnect (неблокирование), в указывается сбой попытки подключения. Эта спецификация не определяет, какие другие ошибки будут включены.

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

Сводка: сокет будет определен в определенном наборе, если LPWSPSelect возвращается в соответствии со следующими значениями.

Параметр Описание
чтения: Если вызывается LPWSPListen, подключение ожидается, LPWSPAccept будет выполнено успешно. Данные доступны для чтения (включая данные OOB, если SO_OOBINLINE включен). Подключение было закрыто, сброшено или завершено.
записи: Если LPWSPConnect (неблокирование), подключение выполнено успешно. Данные можно отправлять.
за исключением: Если LPWSPConnect (неблокирование), попытка подключения завершилась ошибкой. Данные OOB доступны для чтения (только если SO_OOBINLINE отключены).

 

 

В файле заголовка Ws2spi.h определяются три макроса и одну функцию плей-кл. для управления и проверки наборов дескрипторов. Переменная FD_SETSIZE определяет максимальное количество дескрипторов в наборе. (Значение по умолчанию FD_SETSIZE равно 64, которое может быть изменено #defining FD_SETSIZE на другое значение до #including Ws2spi.h.) Внутри системы дескриптор сокетов в fd_set не представлен как битовые флаги, как в Berkeley UNIX. Их представление данных непрозрачно. Использование этих макросов будет поддерживать переносимость программного обеспечения между разными средами сокетов.

Макросы для управления и проверки содержимого fd_set:

FD_CLR(, *набор)

Удаляет дескриптора из набора.

FD_SET(, *set)

Добавляет дескриптора в набор.

FD_ZERO(*задать)

Инициализирует набор для набора null.

Функция хипалл, используемая для проверки членства:

intWPUFDIsSet (СОКЕТ, FD_SET FAR *set);

значение, возвращающее ненулевое значение, если является членом набора или иначе ноль.

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

Заметка

Функция LPWSPSelect не влияет на сохраняемость событий сокета, зарегистрированных в LPWSPAsyncSelect или LPWSPEventSelect.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000 Профессиональный [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
заголовка ws2spi.h

См. также

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo