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

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

Синтаксис

LPFN_RIORECEIVE LpfnRioreceive;

BOOL LpfnRioreceive(
  RIO_RQ SocketQueue,
  PRIO_BUF pData,
  ULONG DataBufferCount,
  DWORD Flags,
  PVOID RequestContext
)
{...}

Параметры

SocketQueue

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

pData

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

Этот параметр может иметь значение NULL для привязанного зарегистрированного сокета UDP ввода-вывода, если приложению не нужно получать полезные данные в датаграмме UDP.

DataBufferCount

Параметр счетчика буфера данных, указывающий, должны ли данные быть получены в буфере, на который указывает параметр pData .

Этот параметр должен иметь значение 0, если значение pData равно NULL. В противном случае этому параметру следует присвоить значение 1.

Flags

Набор флагов, которые изменяют поведение функции RIOReceive .

Параметр Flags может содержать сочетание следующих параметров, определенных в файле заголовка Mswsockdef.h :

RIO_MSG_COMMIT_ONLY

Предыдущие запросы, добавленные с флагом RIO_MSG_DEFER , будут зафиксированы.

Если флаг RIO_MSG_COMMIT_ONLY установлен, другие флаги не могут быть указаны. Если установлен флаг RIO_MSG_COMMIT_ONLY , аргументы pData и RequestContext должны иметь значение NULL, а аргумент DataBufferCount должен быть равен нулю.

Этот флаг обычно используется иногда после того, как несколько запросов были выданы с установленным флагом RIO_MSG_DEFER . Это избавляет от необходимости при использовании флага RIO_MSG_DEFER выполнять последний запрос без флага RIO_MSG_DEFER , что приводит к тому, что последний запрос выполняется гораздо медленнее, чем другие запросы.

В отличие от других вызовов функции RIOReceive , при установке флага RIO_MSG_COMMIT_ONLY вызовы функции RIOReceive не нужно сериализовать. Для одного RIO_RQ функцию RIOReceive можно вызывать с помощью RIO_MSG_COMMIT_ONLY в одном потоке при вызове функции RIOReceive в другом потоке.

RIO_MSG_DONT_NOTIFY

Запрос не должен активировать функцию RIONotify при вставке завершения запроса в очередь завершения.

RIO_MSG_DEFER

Запрос не нужно выполнять немедленно. Это приведет к вставке запроса в очередь запросов, но может вызвать или не запустить выполнение запроса.

Прием данных может быть отложен до выполнения запроса на получение RIO_RQ , переданного в параметре SocketQueue без установленного флага RIO_MSG_DEFER . Чтобы активировать выполнение для всех получаемых сообщений в очереди запросов, вызовите функцию RIOReceive или RIOReceiveEx без установленного флага RIO_MSG_DEFER .

Примечание

Плата за запрос на получение взимается за неоплаченную емкость ввода-вывода в RIO_RQ , переданной в параметре SocketQueue , независимо от того, задана ли RIO_MSG_DEFER .

RIO_MSG_WAITALL

Функция RIOReceive не будет завершена, пока не произойдет одно из следующих событий:

  • Сегмент буфера, предоставленный вызывающим объектом в параметре pData , полностью заполнен.
  • Соединение было закрыто.
  • Запрос был отменен или произошла ошибка.

Этот флаг не поддерживается в сокетах UDP.

RequestContext

Контекст запроса, который необходимо связать с этой операцией получения.

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

Если ошибка не возникает, функция RIOReceive возвращает значение TRUE. В этом случае операция получения успешно запущена, и завершение будет уже поставлено в очередь или операция успешно запущена, а завершение будет помещено в очередь позже.

Значение FALSE указывает, что функция завершилась сбоем, операция не была успешно инициирована, и индикатор завершения не будет помещен в очередь. Конкретный код ошибки можно получить, вызвав функцию WSAGetLastError .

Код возврата Описание
WSAEFAULT Система обнаружила недопустимый адрес указателя при попытке использовать аргумент указателя в вызове. Эта ошибка возвращается, если идентификатор буфера отменяется или буфер освобождается для любой из RIO_BUF структур, переданных в параметрах до постановки в очередь или вызова операции.
WSAEINVAL В функцию передан недопустимый параметр.
Эта ошибка возвращается, если параметр SocketQueue недопустим, параметр Flags содержит значение, недопустимое для операции получения, или целостность очереди завершения была скомпрометирована. Эта ошибка также может быть возвращена для других проблем с параметрами.
WSAENOBUFS Не удалось выделить достаточный объем памяти. Эта ошибка возвращается, если очередь завершения ввода-вывода, связанная с параметром SocketQueue , заполнена или очередь завершения ввода-вывода была создана с нулевыми записями получения.
WSA_OPERATION_ABORTED Операция была отменена, пока операция получения находилась в ожидании. Эта ошибка возвращается, если сокет закрыт локально или удаленно или в этом сокете выполняется команда SIO_FLUSH в WSAIoctl .

Комментарии

Приложение может использовать функцию RIOReceive для получения сетевых данных в любой буфер, полностью содержащийся в одном зарегистрированном буфере. Элементы Offset и Length структуры RIO_BUF , на которые указывает параметр pData, определяют, где в буфере получены сетевые данные.

После вызова функции RIOReceive буфер, переданный в параметре pData , включая RIO_BUFFERID в элементе BufferIdструктуры RIO_BUF , должен оставаться действительным в течение операции получения.

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

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

Примечание

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

Требования

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