Функция обратного вызова 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 с любым из этих значений.
Ценность | Значение |
---|---|
|
Проблемы с уведомлением о готовности к чтению. |
|
Проблемы с уведомлением о готовности к написанию. |
|
Выдает уведомление о поступлении данных OOB. |
|
Проблемы с уведомлением о входящих подключениях. |
|
Проблемы с уведомлением о завершенных подключениях. |
|
Проблемы с уведомлением о закрытии сокета. |
|
Проблемы с уведомлением об изменениях сокета (QoS). |
|
Скрытный. |
|
Проблемы с уведомлением об изменениях интерфейса маршрутизации для указанных назначений. |
|
Проблемы с уведомлением об изменении списка адресов локального адреса для семейства адресов сокета. |
[out] lpErrno
Указатель на код ошибки. Дополнительные сведения см. в разделе Возвращаемое значение.
Возвращаемое значение
Возвращаемое значение равно нулю, если спецификация клиента SPI сокетов Windows для сетевых событий и связанного объекта события успешно выполнена. В противном случае возвращается значение SOCKET_ERROR, а определенный номер ошибки доступен в lpErrno.
Код ошибки | Значение |
---|---|
Сбой сетевой подсистемы. | |
Указывает, что один из указанных параметров недопустим, или указанный сокет находится в недопустимом состоянии. | |
Блокировка вызова сокетов Windows выполняется или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Дескриптор не является сокетом. |
Замечания
Эта функция используется для указания объекта события hEventObject, связанного с выбранными сетевыми событиями, lNetworkEvents. Сокет, для которого указан объект события, определяется . Объект события устанавливается при возникновении любого из номинированных сетевых событий.
LPWSPEventSelect работает очень аналогично LPWSPAsyncSelect, разница в действиях, выполняемых при возникновении номинированного сетевого события. В то время как WSPAsyncSelect приводит к публикации сообщения, указанного клиентом Windows Sockets SPI, LPWSPEventSelect задает связанный объект события и записывает событие в запись внутреннего сетевого события. Клиент SPI сокетов Windows может использовать LPWSPEnumNetworkEvents для получения содержимого записи внутреннего сетевого события и таким образом определить, какие из назначенных сетевых событий произошли.
LPWSPEventSelect — единственная функция, которая приводит к записи и ошибкам сети через LPWSPEnumNetworkEvents. Ознакомьтесь с описаниями
Эта функция автоматически устанавливает сокетов в режим неблокировки независимо от значения 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 управлять событиями, а также не беспокоиться о количестве данных, поступающих в любое время. Рассмотрим следующую последовательность.
- Поставщик услуг получает 100 байт данных всокета
, записывает событие FD_READ сети и сигнализирует связанному объекту события. - Проблемы с клиентом SPI для сокетов Windows
WSPRecv(s, buffptr, 50, 0)
для чтения 50 байтов. - Поставщик услуг записывает 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или при повторном включении функции, то сетевое событие записывается, а связанный объект события сигнализируется соответствующим образом. Например, рассмотрим следующую последовательность.
- Клиент SPI для Сокетов Windows вызывает LPWSPListen.
- Запрос подключения получен, но еще не принят.
- Клиент SPI сокетов Windows вызывает LPWSPEventSelect указав, что он заинтересован в FD_ACCEPT сетевом событии для сокета. Поставщик услуг записывает FD_ACCEPT сетевое событие и немедленно сообщает связанному объекту событий.
FD_WRITE сетевое событие обрабатывается немного иначе. Сетевое событие 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 записывается, если в спецификации потока было изменено любое поле, связанное ссокета
Событие сети 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 |