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


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

Функция LPWSPEventSelect указывает объект события, связанный с предоставленным набором сетевых событий.

Синтаксис

LPWSPEVENTSELECT Lpwspeventselect;

int Lpwspeventselect(
  [in]  SOCKET s,
  [in]  WSAEVENT hEventObject,
  [in]  long lNetworkEvents,
  [out] LPINT lpErrno
)
{...}

Параметры

[in] s

Дескриптор, определяющий сокет.

[in] hEventObject

Дескриптор, определяющий объект события, связанный с предоставленным набором сетевых событий.

[in] lNetworkEvents

Битовая маска, указывающая сочетание сетевых событий, в которых заинтересован клиент SPI сокетов Windows. Создается с помощью побитового оператора OR с любым из этих значений.

Ценность Значение
FD_READ
Проблемы с уведомлением о готовности к чтению.
FD_WRITE
Проблемы с уведомлением о готовности к написанию.
FD_OOB
Выдает уведомление о поступлении данных OOB.
FD_ACCEPT
Проблемы с уведомлением о входящих подключениях.
FD_CONNECT
Проблемы с уведомлением о завершенных подключениях.
FD_CLOSE
Проблемы с уведомлением о закрытии сокета.
FD_QOS
Проблемы с уведомлением об изменениях сокета (QoS).
FD_GROUP_QOS
Скрытный.
FD_ROUTING_INTERFACE_CHANGE
Проблемы с уведомлением об изменениях интерфейса маршрутизации для указанных назначений.
FD_ADDRESS_LIST_CHANGE
Проблемы с уведомлением об изменении списка адресов локального адреса для семейства адресов сокета.

[out] lpErrno

Указатель на код ошибки. Дополнительные сведения см. в разделе Возвращаемое значение.

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

Возвращаемое значение равно нулю, если спецификация клиента SPI сокетов Windows для сетевых событий и связанного объекта события успешно выполнена. В противном случае возвращается значение SOCKET_ERROR, а определенный номер ошибки доступен в lpErrno.

Код ошибки Значение
WSAENETDOWN
Сбой сетевой подсистемы.
WSAEINVAL
Указывает, что один из указанных параметров недопустим, или указанный сокет находится в недопустимом состоянии.
WSAEINPROGRESS
Блокировка вызова сокетов Windows выполняется или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAENOTSOCK
Дескриптор не является сокетом.

Замечания

Эта функция используется для указания объекта события hEventObject, связанного с выбранными сетевыми событиями, lNetworkEvents. Сокет, для которого указан объект события, определяется . Объект события устанавливается при возникновении любого из номинированных сетевых событий.

LPWSPEventSelect работает очень аналогично LPWSPAsyncSelect, разница в действиях, выполняемых при возникновении номинированного сетевого события. В то время как WSPAsyncSelect приводит к публикации сообщения, указанного клиентом Windows Sockets SPI, LPWSPEventSelect задает связанный объект события и записывает событие в запись внутреннего сетевого события. Клиент SPI сокетов Windows может использовать LPWSPEnumNetworkEvents для получения содержимого записи внутреннего сетевого события и таким образом определить, какие из назначенных сетевых событий произошли.

LPWSPEventSelect — единственная функция, которая приводит к записи и ошибкам сети через LPWSPEnumNetworkEvents. Ознакомьтесь с описаниями LPWSPSelect и LPWSPAsyncSelect, чтобы узнать, как эти функции сообщают о сетевой активности и ошибках.

Эта функция автоматически устанавливает сокетов в режим неблокировки независимо от значения lNetworkEvents.

Выдача LPWSPEventSelect для сокета отменяет все предыдущие LPWSPAsyncSelect или LPWSPEventSelect для того же сокета и очищает запись внутреннего сетевого события. Например, чтобы связать объект события с событиями чтения и записи сетевых событий, клиент SPI сокетов Windows должен вызывать LPWSPEventSelect как с FD_READ, так и с FD_WRITE, как показано ниже.

rc = WSPEventSelect(s, hEventObject, FD_READ | FD_WRITE);

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

// Incorrect example.
rc = WSPEventSelect(s, hEventObject1, FD_READ);
rc = WSPEventSelect(s, hEventObject2, FD_WRITE);

Чтобы отменить связь и выбор сетевых событий в сокете, необходимо задать для параметра lNetworkEvents значение нулю, в этом случае параметр hEventObject игнорируется.

rc = WSPEventSelect(s, hEventObject, 0);

Закрытие сокета с LPWSPCloseSocket также отменяет связь и выбор сетевых событий, указанных в LPWSPEventSelect для сокета. Однако клиент SPI сокетов Windows по-прежнему должен вызывать WSACloseEvent, чтобы явно закрыть объект события и освободить все ресурсы.

Так как LPWSPAccept"сокет ed имеет те же свойства, что и сокет прослушивания, используемый для принятия, любые LPWSPEventSelect связи и набор сетевых событий для прослушивающего сокета применяются к принятому сокету. Например, если сокет прослушивания имеет LPWSPEventSelect сопоставление hEventObject с FD_ACCEPT, FD_READ и FD_WRITE, то все сокеты, принятые в этом сокете, также будут иметь FD_ACCEPT, FD_READ и FD_WRITE сетевые события, связанные с тем же hEventObject. Если нужны другие hEventObject или сетевые события, клиент SPI сокетов Windows должен вызвать LPWSPEventSelect, передать принятый сокет и нужную новую информацию.

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

Сетевое событие Повторное включение функции
FD_READ LPWSPRecv или LPWSPRecvFrom
FD_WRITE LPWSPSend или LPWSPSendTo
FD_OOB LPWSPRecv или LPWSPRecvFrom
FD_ACCEPT LPWSPAccept, если возвращен код ошибки WSATRY_AGAIN, указывающий, что функция условия возвращает CF_DEFER
FD_CONNECT НИКАКОЙ
FD_CLOSE НИКАКОЙ
FD_QOS LPWSPIoctl с SIO_GET_QOS
FD_GROUP_QOS Зарезервировано для дальнейшего использования с группами сокетов: LPWSPIoctl с SIO_GET_GROUP_QOS
FD_ROUTING_INTERFACE_CHANGE LPWSPIoctl с командой SIO_ROUTING_INTERFACE_CHANGE
FD_ADDRESS_LIST_CHANGE LPWSPIoctl с командой SIO_ADDRESS_LIST_CHANGE

Любой вызов подпрограммы повторного включения, даже тот, который завершается сбоем, приводит к повторному включению записи и сигналов для соответствующего сетевого события и объекта события соответственно.

Для FD_READ, FD_OOB и FD_ACCEPT сетевых событий, записи сетевых событий и сигналов объекта события уровня. Это означает, что если вызывается подпрограмма повторного включения, и соответствующее сетевое условие по-прежнему допустимо после вызова, то сетевое событие записывается, а связанный объект события сигнализирует. Это позволяет клиенту SPI сокетов Windows управлять событиями, а также не беспокоиться о количестве данных, поступающих в любое время. Рассмотрим следующую последовательность.

  1. Поставщик услуг получает 100 байт данных всокета , записывает событие FD_READ сети и сигнализирует связанному объекту события.
  2. Проблемы с клиентом SPI для сокетов Windows WSPRecv(s, buffptr, 50, 0) для чтения 50 байтов.
  3. Поставщик услуг записывает FD_READ сетевое событие и снова сигнализирует связанному объекту событий, так как данные по-прежнему будут считываться.

С этой семантикой клиент SPI сокетов Windows не должен считывать все доступные данные в ответ на событие FD_READ сети. Скорее, один LPWSPRecv в ответ на каждое FD_READ сетевое событие подходит.

События FD_QOS и FD_GROUP_QOS считаются с помощью пограничных вычислений. Сообщение будет опубликовано ровно один раз, когда происходит изменение качества обслуживания (QOS). Дальнейшие указания не будут выдаваться, пока поставщик услуг не обнаружит дальнейшее изменение в QOS, или клиент SPI сокетов Windows перенацеливает QOS для сокета.

События FD_ROUTING_INTERFACE_CHANGE и FD_ADDRESS_LIST_CHANGE также считаются с помощью пограничных вычислений. Сообщение будет опубликовано ровно один раз, когда происходит изменение после клиент SPI сокетов Windows запрашивает уведомление, выдав WSAIoctl с SIO_ROUTING_INTERFACE_CHANGE или SIO_ADDRESS_LIST_CHANGE соответствующим образом. Дальнейшие сообщения не будут предстоящими, пока клиент SPI сокетов Windows переиздает IOCTL и другое изменение обнаружено после выдачи IOCTL.

Если сетевое событие уже произошло, когда клиент SPI сокетов Windows вызывает LPWSPEventSelectили при повторном включении функции, то сетевое событие записывается, а связанный объект события сигнализируется соответствующим образом. Например, рассмотрим следующую последовательность.

  1. Клиент SPI для Сокетов Windows вызывает LPWSPListen.
  2. Запрос подключения получен, но еще не принят.
  3. Клиент SPI сокетов Windows вызывает LPWSPEventSelect указав, что он заинтересован в FD_ACCEPT сетевом событии для сокета. Поставщик услуг записывает FD_ACCEPT сетевое событие и немедленно сообщает связанному объекту событий.

FD_WRITE сетевое событие обрабатывается немного иначе. Сетевое событие FD_WRITE записывается при первом подключении сокета с LPWSPConnect или принято с LPWSPAccept, а затем после LPWSPSend или LPWSPSendTo завершается ошибкой WSAEWOULDBLOCK и буферного пространства. Поэтому клиент SPI сокетов Windows может предположить, что отправка возможна начиная с первого параметра сетевого события FD_WRITE и срок действия до тех пор, пока отправка не вернет WSAEWOULDBLOCK. После такого сбоя клиент SPI сокетов Windows обнаружит, что отправка снова возможна, когда записывается сетевое событие FD_WRITE, а связанный объект события сигнализирует.

FD_OOB сетевое событие используется только в том случае, если сокет настроен для получения данных вне диапазона отдельно. Если сокет настроен на получение внеполосных данных в строке, то внеполосные (ускоряемые) данные обрабатываются как обычные данные, а клиент SPI сокетов Windows должен зарегистрировать интерес и получить, FD_READ сетевое событие, а не FD_OOB сетевое событие. Клиент SPI для сокетов Windows может задать или проверить способ обработки внеполновых данных с помощью LPWSPSetSockOpt или LPWSPGetSockOpt для параметра SO_OOBINLINE.

Код ошибки в FD_CLOSE сетевом событии указывает, было ли закрытие сокета грациозным или прерванным. Если код ошибки равен 0, то закрытие было грациозным; Если код ошибки — WSAECONNRESET, то виртуальный канал сокета был сброшен. Это относится только к сокетам, ориентированным на подключение, таким как SOCK_STREAM.

Событие FD_CLOSE сети записывается при получении близкого указания для виртуального канала, соответствующего сокету. В терминах TCP это означает, что FD_CLOSE записываются при переходе подключения в состояния FIN WAIT или CLOSE WAIT. Результаты удаленного выполнения LPWSPShutdown на стороне отправки или LPWSPCloseSocket.

Поставщики услуг должны записывать только сетевое событие FD_CLOSE, чтобы указать закрытие виртуального канала; Он должен не записать FD_READ сетевое событие, чтобы указать это условие.

Событие сети FD_QOS или FD_GROUP_QOS записывается, если в спецификации потока было изменено любое поле, связанное ссокета сокета, или группа сокетов , к которой сокетов принадлежит соответственно. Это изменение должно быть доступно для клиентов SPI сокетов Windows через функцию LPWSPIoctl с SIO_GET_QOS и (или) SIO_GET_GROUP_QOS, чтобы получить текущий QOS для сокетовили для группы сокетов принадлежит соответственно.

Событие сети FD_ROUTING_INTERFACE_CHANGE записывается, когда локальный интерфейс, который должен использоваться для достижения назначения, указанного в WSAIoctl с SIO_ROUTING_INTERFACE_CHANGE изменениями после выдачи такого IOCTL.

Событие FD_ADDRESS_LIST_CHANGE сети записывается при получении списка адресов семейства протоколов сокетов, к которому клиент SPI сокетов Windows может привязать изменения послеWSAIoctl с SIO_ADDRESS_LIST_CHANGE.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Сборка Windows 10 20348
минимальный поддерживаемый сервер Сборка Windows 10 20348
заголовка ws2spi.h

См. также

LPWSPEnumNetworkEvents