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


Функция обратного вызова 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 для операции блокировки в виде структуры timeval .

[out] lpErrno

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

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

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

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

Комментарии

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

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

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

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

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

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

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

Любые два объекта readfd,writefds или exceptfds могут быть присвоены в виде null , если дескрипторы не проверяются на наличие интересующего условия. По крайней мере один должен быть не null, а любой набор дескрипторов, отличных от NULL , должен содержать по крайней мере один дескриптор сокета.

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

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

 

 

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

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

FD_CLR, *set)

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

FD_SET, *set)

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

FD_ZERO(*set)

Инициализирует набор со значением NULL .

Для проверка членства используется функция хеп-все:

intWPUFDIsSet (SOCKETs, FD_SET FAR *set);

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

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

Примечание

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

Требования

   
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Верхняя часть ws2spi.h

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

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo