функция обратного вызова LPFN_RIONOTIFY (mswsock.h)
Функция RIONotify регистрирует метод, используемый для поведения уведомлений, в очереди завершения ввода-вывода для использования с зарегистрированными расширениями ввода-вывода Winsock.
Синтаксис
LPFN_RIONOTIFY LpfnRionotify;
INT LpfnRionotify(
RIO_CQ CQ
)
{...}
Параметры
CQ
Дескриптор, идентифицирующий очередь завершения ввода-вывода.
Возвращаемое значение
Если ошибка не возникает, функция RIONotify возвращает ERROR_SUCCESS. В противном случае функция завершилась сбоем и возвращается определенный код ошибки.
Код возврата | Описание |
---|---|
В функцию передан недопустимый параметр. Эта ошибка возвращается, если недопустимая очередь завершения передается в параметре CQ (например, RIO_INVALID_CQ). Эта ошибка также может быть возвращена при возникновении внутренней ошибки. |
|
Была предпринята попытка выполнить операцию на неблокируемом сокете, на котором уже выполнялась операция. Эта ошибка возвращается, если предыдущий запрос 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 |