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

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

Синтаксис

LPFN_RIOSENDEX LpfnRiosendex;

BOOL LpfnRiosendex(
  RIO_RQ SocketQueue,
  PRIO_BUF pData,
  ULONG DataBufferCount,
  PRIO_BUF pLocalAddress,
  PRIO_BUF pRemoteAddress,
  PRIO_BUF pControlContext,
  PRIO_BUF pFlags,
  DWORD Flags,
  PVOID RequestContext
)
{...}

Параметры

SocketQueue

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

pData

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

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

DataBufferCount

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

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

pLocalAddress

Этот параметр зарезервирован и должен иметь значение NULL.

pRemoteAddress

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

Этот параметр может иметь значение NULL , если сокет подключен.

pControlContext

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

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

pFlags

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

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

Flags

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

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

RIO_MSG_COMMIT_ONLY

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

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

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

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

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

Контекст запроса для связи с данной операцией отправки.

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

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

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

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

Комментарии

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

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

Параметр pLocalAddress можно использовать для получения локального адреса, с которого были отправлены данные. Параметр pRemoteAddress можно использовать для получения удаленного адреса, на который были отправлены данные. Локальные и удаленные адреса возвращаются в виде SOCKADDR_INET структур. В результате элемент LengthRIO_BUF , на который указывают параметры pLocalAddress или pRemoteAddress , должен быть равен или больше размера структуры SOCKADDR_INET .

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

Протокол cmsg_level cmsg_type Описание
IPv4 IPPROTO_IP IP_PKTINFO Указывает или получает сведения о пакете.
Дополнительные сведения см. в разделе Параметры сокета IPPROTO_IP для параметра сокета IP_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_DSTOPTS Задает и получает параметры назначения.
IPv6 IPPROTO_IPV6 IPV6_HOPLIMIT Указывает ограничение прыжков и их получение.
Дополнительные сведения см. в разделе Параметры сокета IPPROTO_IPV6 для параметра сокета IPV6_HOPLIMIT.
IPv6 IPPROTO_IPV6 IPV6_HOPOPTS Задает и получает параметры перехода за прыжком.
IPv6 IPPROTO_IPV6 IPV6_NEXTHOP Указывает адрес следующего прыжка.
IPv6 IPPROTO_IPV6 IPV6_PKTINFO Указывает или получает сведения о пакете.
Дополнительные сведения см. в разделе Параметры сокета IPPROTO_IPV6 для параметра сокета IPV6_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_RTHDR Задает/получает заголовок маршрутизации.

Данные элемента управления состоят из одного или нескольких объектов данных управления, каждый из которых начинается со структуры WSACMSGHDR , определенной следующим образом:

} WSACMSGHDR;

Ниже перечислены элементы структуры WSACMSGHDR .

Термин Описание
cmsg_len Число байтов данных, начиная с начала WSACMSGHDR и до конца данных (за исключением байтов заполнения, которые могут следовать за данными).
cmsg_level Протокол, который является источником сведений об элементе управления.
cmsg_type Тип сведений об управлении для конкретного протокола.

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

Примечание

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