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


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

Функция RIONotify регистрирует метод, используемый для поведения уведомлений, в очереди завершения ввода-вывода для использования с зарегистрированными расширениями ввода-вывода Winsock.

Синтаксис

LPFN_RIONOTIFY LpfnRionotify;

INT LpfnRionotify(
  RIO_CQ CQ
)
{...}

Параметры

CQ

Дескриптор, идентифицирующий очередь завершения ввода-вывода.

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

Если ошибка не возникает, функция RIONotify возвращает ERROR_SUCCESS. В противном случае функция завершилась сбоем и возвращается определенный код ошибки.

Код возврата Описание
WSAEINVAL
В функцию передан недопустимый параметр.
Эта ошибка возвращается, если недопустимая очередь завершения передается в параметре CQ (например, RIO_INVALID_CQ). Эта ошибка также может быть возвращена при возникновении внутренней ошибки.
WSAEALREADY
Была предпринята попытка выполнить операцию на неблокируемом сокете, на котором уже выполнялась операция.
Эта ошибка возвращается, если предыдущий запрос RIONotify еще не завершен.

Комментарии

Функция RIONotify регистрирует метод, используемый для уведомления при отправке или получении сетевых данных с помощью зарегистрированных расширений ввода-вывода Winsock.

Функция RIONotify — это механизм, с помощью которого приложение обнаруживает, что запросы завершены и ожидают вызова функции RIODequeueCompletion . Функция RIONotify задает метод, используемый для поведения уведомления, если очередь завершения ввода-вывода не пуста и содержит завершение результата.

Поведение уведомлений для очереди завершения задается при создании RIO_CQ . Структура RIO_NOTIFICATION_COMPLETION передается в функцию RIOCreateCompletionQueue при создании RIO_CQ .

Для очереди завершения, которая использует событие, для элемента Typeструктуры RIO_NOTIFICATION_COMPLETION задано значение RIO_EVENT_COMPLETION. Элемент Event.EventHandle должен содержать дескриптор события, созданного функцией WSACreateEvent или CreateEvent . Чтобы получить завершение RIONotify , приложение должно ожидать указанного дескриптора события с помощью WSAWaitForMultipleEvents или аналогичной подпрограммы ожидания. Если приложение планирует сбросить и повторно использовать событие, приложение может уменьшить затраты, задав для элемента Event.NotifyReset значение, отличное от нуля. Это приводит к автоматическому сбросу события функцией RIONotify при появлении уведомления. Это устраняет необходимость вызова функции WSAResetEvent для сброса события между вызовами функции RIONotify .

Если функция RIONotify вызывается использованным завершением событий, а указанная очередь завершения уже не пуста, событие устанавливается синхронно или асинхронно. В обоих случаях дополнительные записи не нужно вводить в очередь завершения до установки события. До тех пор, пока очередь завершения не будет содержать завершения запроса, для которых не установлен флаг RIO_MSG_DONT_NOTIFY , очередь завершения считается пустой для целей функции RIONotify , а событие не задано. Все завершенные запросы по-прежнему можно получить с помощью функции RIODequeueCompletion . Когда событие задано, приложение обычно вызывает функцию RIODequeueCompletion для вывода в очередь завершенных запросов отправки и получения.

Для очереди завершения, которая использует порт завершения ввода-вывода, элемент Typeструктуры RIO_NOTIFICATION_COMPLETION имеет значение RIO_IOCP_COMPLETION. Элемент Iocp.IocpHandle должен содержать дескриптор для порта завершения ввода-вывода, созданного функцией CreateIoCompletionPort . Чтобы получить завершение RIONotify , приложение должно вызвать функцию GetQueuedCompletionStatus или GetQueuedCompletionStatusEx . Приложение должно предоставить выделенный объект OVERLAPPED для очереди завершения. Кроме того, оно может использовать элемент Iocp.CompletionKey , чтобы отличать запросы RIONotify в очереди завершения от других завершений ввода-вывода, включая завершения RIONotify для других очередей завершения.

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

Примечание

Указатель функции на функцию RIONotify должен быть получен во время выполнения путем вызова функции WSAIoctl с указанным SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER кодом операции. Входной буфер, передаваемый в функцию WSAIoctl , должен содержать WSAID_MULTIPLE_RIO, глобальный уникальный идентификатор (GUID), значение которого определяет зарегистрированные функции расширения ввода-вывода Winsock. При успешном выполнении выходные данные, возвращаемые функцией WSAIoctl , содержат указатель на структуру RIO_EXTENSION_FUNCTION_TABLE , содержащую указатели на зарегистрированные функции расширения ввода-вывода Winsock. SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL определяется в файле заголовка Ws2def.h. Guid WSAID_MULTIPLE_RIO определяется в файле заголовка Mswsock.h .

 

Windows Phone 8. Эта функция поддерживается для приложений Магазина Windows Phone Windows Phone 8 и более поздних версий.

Windows 8.1 и Windows Server 2012 R2. Эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.

Потокобезопасность

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

Требования

Требование Значение
Заголовок mswsock.h