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


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

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

Синтаксис

LPFN_RIODEQUEUECOMPLETION LpfnRiodequeuecompletion;

ULONG LpfnRiodequeuecompletion(
  RIO_CQ CQ,
  PRIORESULT Array,
  ULONG ArraySize
)
{...}

Параметры

CQ

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

Array

Массив структур RIORESULT для получения описания завершений, выведенных из очереди.

ArraySize

Максимальное число записываемых записей в массиве .

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

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

Комментарии

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

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

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

Если очередь завершения ввода-вывода, переданная в параметре CQ , недопустимая или поврежденная, функция RIODequeueCompletion возвращает число RIO_CORRUPT_CQ.

Функция RIODequeueCompletion возвращает нулевое значение, если нет завершенных запросов на отправку или получение, которые должны быть выведены из очереди.

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

Примечание

Для повышения эффективности доступ к очередям завершения (RIO_CQ структуры) и очередям запросов (RIO_RQ структуры) не защищен примитивами синхронизации. Если вам нужно получить доступ к очереди завершения или запроса из нескольких потоков, доступ должен координироваться критически важным разделом, тонкой блокировкой записи считывания или аналогичным механизмом. Эта блокировка не требуется для доступа одного потока. Различные потоки могут получать доступ к отдельным очередям запросов и завершения без блокировок. Синхронизация возникает только в том случае, если несколько потоков пытаются получить доступ к одной очереди. Синхронизация также требуется, если несколько потоков отправляют и получают в одном сокете, так как операции отправки и получения используют очередь запросов сокета.

 

Примечание

Указатель функции на функцию RIODequeueCompletion должен быть получен во время выполнения путем вызова функции 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