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

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

Синтаксис

LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;

RIO_RQ LpfnRiocreaterequestqueue(
  SOCKET Socket,
  ULONG MaxOutstandingReceive,
  ULONG MaxReceiveDataBuffers,
  ULONG MaxOutstandingSend,
  ULONG MaxSendDataBuffers,
  RIO_CQ ReceiveCQ,
  RIO_CQ SendCQ,
  PVOID SocketContext
)
{...}

Параметры

Socket

Дескриптор, идентифицирующий сокет.

MaxOutstandingReceive

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

Этот параметр обычно является небольшим числом для большинства приложений.

MaxReceiveDataBuffers

Максимальное количество буферов данных приема в сокете.

Примечание

Для Windows 8 и Windows Server 2012 этот параметр должен иметь значение 1.

MaxOutstandingSend

Максимальное число невыполненных операций отправки, разрешенных в сокете.

MaxSendDataBuffers

Максимальное количество буферов данных отправки в сокете.

Примечание

Для Windows 8 и Windows Server 2012 этот параметр должен иметь значение 1.

ReceiveCQ

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

SendCQ

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

Этот параметр может иметь то же значение, что и параметр ReceiveCQ .

SocketContext

Контекст сокета для связи с этой очередью запросов.

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

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

Код возврата Описание
WSAEINVAL
В функцию передан недопустимый параметр.
Эта ошибка возвращается, если параметры ReceiveCQ или SendCQсодержатся RIO_INVALID_CQ. Эта ошибка возвращается, если параметры MaxOutstandingReceive и MaxOutstandingSend равны нулю . Эта ошибка также возвращается, если сокет, переданный в параметре Socket , находится в процессе инициализации или закрытия.
WSAENOBUFS
Не удалось выделить достаточный объем памяти. Эта ошибка возвращается, если недостаточно памяти для выделения очереди запросов на основе параметров. Эта ошибка также возвращается, если превышено ограничение сетевого сеанса.
WSAENOTSOCK
Дескриптор не является сокетом. Эта ошибка возвращается, если параметр Socket не является допустимым сокетом.
WSAEOPNOTSUPP
Предпринятая операция не поддерживается для типа объекта, на который ссылается ссылка. Эта ошибка возвращается для сокета в параметре Socket для неподдерживаемого типа сокета (например, SOCK_RAW).

Комментарии

Функция RIOCreateRequestQueue создает зарегистрированный дескриптор сокета ввода-вывода, используя указанные очереди сокета и завершения ввода-вывода. Приложение должно вызвать RIOCreateRequestQueue , чтобы получить RIO_RQ для сокета Winsock, прежде чем приложение сможет использовать функции RIOSend, RIOSendEx, RIOReceive или RIOReceiveEx . Чтобы получить RIO_RQ, сокет Winsock должен быть связан с очередями завершения для отправки и получения, хотя одну и ту же очередь завершения можно использовать для обоих.

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

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

Примечание

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

 

После завершения работы приложения с использованием RIO_RQ приложение должно вызвать функцию closesocket , чтобы закрыть сокет и освободить связанные ресурсы.

Примечание

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