функция обратного вызова PFN_WSK_RECEIVE_FROM_EVENT (wsk.h)

Функция обратного вызова события WskReceiveFromEvent уведомляет приложение WSK о получении одной или нескольких датаграмм в сокете датаграмм.

Синтаксис

PFN_WSK_RECEIVE_FROM_EVENT PfnWskReceiveFromEvent;

NTSTATUS PfnWskReceiveFromEvent(
  [in, optional] PVOID SocketContext,
  [in]           ULONG Flags,
  [in, optional] PWSK_DATAGRAM_INDICATION DataIndication
)
{...}

Параметры

[in, optional] SocketContext

Указатель на контекст сокета для сокета, который получил датаграммы. Приложение WSK предоставило этот указатель на подсистему WSK при вызове функции WskSocket для создания сокета датаграммы.

[in] Flags

Значение ULONG, содержащее побитовое или сочетание следующих флагов:

MSG_BCAST

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

MSG_MCAST

Датаграммы получены с адресом транспорта назначения, который является адресом многоадресной рассылки.

WSK_FLAG_AT_DISPATCH_LEVEL

Подсистема WSK называется функцией обратного вызова события WskReceiveFromEvent по адресу IRQL = DISPATCH_LEVEL. Если этот флаг не задан, подсистема WSK могла вызвать функцию обратного вызова события WskReceiveFromEvent в любом irQL <= DISPATCH_LEVEL.

[in, optional] DataIndication

Указатель на связанный список WSK_DATAGRAM_INDICATION структур, описывающих полученные датаграммы. Если этот параметр имеет значение NULL, сокет больше не работает, и приложение WSK должно вызвать функцию WskCloseSocket , чтобы закрыть сокет как можно скорее.

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

Функция обратного вызова события WskReceiveFromEvent приложения WSK может возвращать один из следующих кодов NTSTATUS:

Код возврата Описание
STATUS_SUCCESS
Приложение WSK приняло датаграммы и извлекло все датаграммы из связанного списка WSK_DATAGRAM_INDICATION структур. Подсистема WSK может снова вызывать функцию обратного вызова события WskReceiveFromEvent при получении новых датаграмм в сокете.
STATUS_PENDING
Приложение WSK приняло датаграммы, но не извлекает все из связанного списка WSK_DATAGRAM_INDICATION структур. Приложение WSK сохраняет связанный список структур WSK_DATAGRAM_INDICATION, пока не будут получены все датаграммы. После того как приложение WSK извлекло все датаграммы, оно вызывает функцию WskRelease , чтобы освободить связанный список WSK_DATAGRAM_INDICATION структур обратно в подсистему WSK. Подсистема WSK может снова вызывать функцию обратного вызова события WskReceiveFromEvent при получении новых датаграмм в сокете.
STATUS_DATA_NOT_ACCEPTED
Приложение WSK не приняло датаграммы. Если приложение WSK возвращает этот код состояния, подсистема WSK будет реагировать по-разному в зависимости от того, как приложение WSK включило функцию обратного вызова события WskReceiveFromEvent .
  • Если приложение WSK включило функцию обратного вызова события WskReceiveFromEvent с помощью параметра сокета SO_WSK_EVENT_CALLBACK , подсистема WSK будет иметь базовый транспортный буфер датаграмм, если это возможно или если это требуется протоколом. Подсистема WSK отключит функцию обратного вызова события WskReceiveFromEvent и не будет повторно вызывать функцию обратного вызова событий WskReceiveFromEvent до тех пор, пока приложение WSK повторно не включит эту функцию обратного вызова события с параметром сокета SO_WSK_EVENT_CALLBACK. После того как приложение WSK повторно включит функцию обратного вызова события WskReceiveFromEvent , подсистема WSK возобновит вызов функции обратного вызова события WskReceiveFromEvent с оставшимися буферизируемыми датаграммами и при получении новых датаграмм в сокете.
  • Если приложение WSK включило функцию обратного вызова события WskReceiveFromEvent с помощью WSK_SET_STATIC_EVENT_CALLBACKS операции управления клиентом подсистема WSK не отключает функцию обратного вызова события WskReceiveFromEvent . Подсистема WSK будет продолжать вызывать функцию обратного вызова события WskReceiveFromEvent при получении новых датаграмм в сокете.

Комментарии

Подсистема WSK вызывает функцию обратного вызова событий WskReceiveFromEvent приложения WSK, когда новые датаграммы принимаются в сокет datagram, только если функция обратного вызова события была ранее включена с параметром сокета SO_WSK_EVENT_CALLBACK . Дополнительные сведения о включении функций обратного вызова событий сокета см. в разделе Включение и отключение функций обратного вызова событий.

Если функция обратного вызова события WskReceiveFromEvent приложения WSK включена в сокете datagram и приложение также имеет ожидающий вызов функции WskReceiveFrom в том же сокете datagram, то при поступлении датаграмм ожидающий вызов функции WskReceiveFrom будет иметь приоритет над функцией обратного вызова события WskReceiveFromEvent . Подсистема WSK вызывает функцию обратного вызова события WskReceiveFromEvent приложения только в том случае, если из ожидающих вызовов функции WskReceiveFrom не было помещено в очередь. Однако приложение WSK не должно предполагать, что подсистема WSK не будет вызывать функцию обратного вызова события WskReceiveFromEvent приложения для сокета датаграммы, который имеет ожидающий вызов функции WskReceiveFrom . Существуют условия гонки, в которых подсистема WSK может по-прежнему вызывать функцию обратного вызова события WskReceiveFromEvent приложения WSK для сокета. Единственный способ для приложения WSK убедиться, что подсистема WSK не будет вызывать функцию обратного вызова событий WskReceiveFromEvent приложения в сокете datagram, — отключить функцию обратного вызова события WskReceiveFromEvent приложения в сокете.

Подсистема WSK вызывает функцию обратного вызова события WskReceiveFromEvent приложения WSK по адресу IRQL <= DISPATCH_LEVEL.

Функция обратного вызова событий WskReceiveFromEvent приложения WSK не должна ждать завершения других запросов WSK в контексте функций завершения WSK или обратного вызова событий. Обратный вызов может инициировать другие запросы WSK (при условии, что он не тратит слишком много времени на DISPATCH_LEVEL), но не должен ждать их завершения, даже если обратный вызов вызывается по irQL = PASSIVE_LEVEL.

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows Vista и более поздних версиях операционных систем Windows.
Целевая платформа Windows
Header wsk.h (включая Wsk.h)
IRQL <= DISPATCH_LEVEL

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

WSK_CLIENT_DATAGRAM_DISPATCH

WSK_DATAGRAM_INDICATION

WskCloseSocket

WskControlSocket

WskReceiveFrom

WskRelease

WskSendTo

WskSocket