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

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

Синтаксис

LPFN_RIOSEND LpfnRiosend;

BOOL LpfnRiosend(
  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

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

Параметр 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 , что приводит к тому, что последний запрос выполняется гораздо медленнее, чем другие запросы.

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

RIO_MSG_DONT_NOTIFY

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

RIO_MSG_DEFER

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

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

Примечание

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

RequestContext

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

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

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

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

Комментарии

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

Буфер, связанный с операцией отправки, не должен использоваться одновременно с другой операцией отправки или получения. Буфер и регистрация буфера должны оставаться действительными в течение операции отправки. Это означает, что не следует передавать один и тот же PRIO_BUF запросу RIOSend(Ex), если он уже находится в ожидании. Повторно использовать тот же PRIO_BUF (с тем же смещением или с другим смещением и длиной) следует повторно использовать только после завершения запроса RIOSend(Ex) в тестовом режиме. Кроме того, если отправляемые данные ссылаются на зарегистрированный буфер (часть или весь буфер), весь зарегистрированный буфер не должен использоваться до завершения отправки. Сюда входит использование части зарегистрированного буфера для операции получения или другой операции отправки.

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

Примечание

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