LPFN_RIOSENDEX función de devolución de llamada (mswsock.h)

La función RIOSendEx envía datos de red en un socket TCP de E/S registrado conectado o un socket UDP de E/S registrado enlazado con opciones adicionales para su uso con las extensiones de E/S registradas de Winsock.

Sintaxis

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
)
{...}

Parámetros

SocketQueue

Descriptor que identifica un socket TCP de E/S registrado conectado o un socket UDP de E/S registrado enlazado.

pData

Segmento de búfer de un búfer registrado desde el que se van a enviar datos. La estructura RIO_BUF a la que apunta este parámetro puede representar una parte de un búfer registrado o un búfer registrado completo.

Este parámetro puede ser NULL para un socket UDP de E/S registrado enlazado si la aplicación no necesita enviar una carga de datos en el datagrama UDP.

DataBufferCount

Parámetro de recuento de búferes de datos que indica si los datos se van a enviar en el búfer al que apunta el parámetro pData .

Este parámetro debe establecerse en cero si pData es NULL. De lo contrario, este parámetro debe establecerse en 1.

pLocalAddress

Este parámetro está reservado y debe ser NULL.

pRemoteAddress

Un segmento de búfer de un búfer registrado que en la entrada contiene la dirección remota a la que se van a enviar los datos de red.

Este parámetro puede ser NULL si el socket está conectado.

pControlContext

Un segmento de búfer que al finalizar contendrá información de control adicional sobre la operación de envío.

Este parámetro puede ser NULL si la aplicación no desea recibir la información de control adicional.

pFlags

Un segmento de búfer que al finalizar contendrá información adicional sobre el conjunto de marcas para la operación de envío.

Este parámetro puede ser NULL si la aplicación no desea recibir la información de marcas adicionales.

Flags

Conjunto de marcas que modifican el comportamiento de la función RIOSendEx .

El parámetro Flags puede contener una combinación de las siguientes opciones, definidas en el archivo de Mswsockdef.h encabezado:

RIO_MSG_COMMIT_ONLY

Se confirmarán las solicitudes anteriores agregadas con RIO_MSG_DEFER marca.

Cuando se establece la marca de RIO_MSG_COMMIT_ONLY , no se puede especificar ninguna otra marca. Cuando se establece la marca de RIO_MSG_COMMIT_ONLY , los argumentos pData, pLocalAddress, pRemoteAddress, pControlContext, pFlags y RequestContext deben ser NULL y el argumento DataBufferCount debe ser cero.

Normalmente, esta marca se usaría ocasionalmente después de emitir varias solicitudes con el conjunto de marcas RIO_MSG_DEFER . Esto elimina la necesidad de usar la marca RIO_MSG_DEFER para realizar la última solicitud sin la marca RIO_MSG_DEFER , lo que hace que la última solicitud se complete mucho más lentamente que otras solicitudes.

A diferencia de otras llamadas a la función RIOSendEx , cuando se establece la marca de RIO_MSG_COMMIT_ONLY , no es necesario serializar las llamadas a la función RIOSendEx . Para una sola RIO_RQ, se puede llamar a la función RIOSendEx con RIO_MSG_COMMIT_ONLY en un subproceso al llamar a la función RIOSendEx en otro subproceso.

RIO_MSG_DONT_NOTIFY

La solicitud no debe desencadenar la función RIONotify cuando se inserta la finalización de la solicitud en su cola de finalización.

RIO_MSG_DEFER

La solicitud no tiene que ejecutarse inmediatamente. Esto insertará la solicitud en la cola de solicitudes, pero puede desencadenar o no la ejecución de la solicitud.

Es posible que el envío de datos se retrase hasta que se realice una solicitud de envío en el RIO_RQ pasado en el parámetro SocketQueue sin la marca RIO_MSG_DEFER establecida. Para desencadenar la ejecución de todos los envíos en una cola de envío, llame a la función RIOSend o RIOSendEx sin la marca de RIO_MSG_DEFER establecida.

Nota

La solicitud de envío se cobra por la capacidad de E/S pendiente en el RIO_RQ pasado en el parámetro SocketQueue , independientemente de si se establece RIO_MSG_DEFER .

RequestContext

Contexto de solicitud que se va a asociar a esta operación de envío.

Valor devuelto

Si no se produce ningún error, la función RIOSendEx devuelve TRUE. En este caso, la operación de envío se inicia correctamente y la finalización ya se ha puesto en cola o la operación se ha iniciado correctamente y la finalización se pondrá en cola en un momento posterior.

Un valor false indica que se produjo un error en la función, la operación no se inició correctamente y no se pondrá en cola ninguna indicación de finalización. Se puede recuperar un código de error específico llamando a la función WSAGetLastError .

Código devuelto Descripción
WSAEFAULT El sistema ha detectado una dirección de puntero no válida al intentar usar un argumento de puntero en una llamada. Este error se devuelve si se anula el registro de un identificador de búfer o se libera un búfer para cualquiera de las estructuras de RIO_BUF pasadas en parámetros antes de que la operación se pone en cola o se invoque.
WSAEINVAL Se pasó un parámetro no válido a la función.
Este error se devuelve si el parámetro SocketQueue no es válido, el parámetro Flags contiene un valor no válido para una operación de envío o la integridad de la cola de finalización se ha puesto en peligro. Este error también se puede devolver para otros problemas con los parámetros.
WSAENOBUFS No se pudo asignar memoria suficiente. Este error se devuelve si la cola de finalización de E/S asociada al parámetro SocketQueue está llena o la cola de finalización de E/S se creó con cero entradas de envío.
WSA_IO_PENDING La operación se ha iniciado correctamente y la finalización se pondrá en cola más adelante.

Comentarios

Una aplicación puede usar la función RIOSendEx para enviar datos de red desde cualquier búfer completamente contenido en un único búfer registrado. Los miembros Offset y Length de la estructura RIO_BUF a la que apunta el parámetro pData determinan los datos de red que se van a enviar desde el búfer.

El búfer asociado a una operación de envío no se debe usar simultáneamente con otra operación de envío o recepción. El búfer y el registro del búfer deben permanecer válidos durante una operación de envío. Esto significa que no debe pasar el mismo PRIO_BUF a una solicitud RIOSend(Ex) cuando ya está pendiente. Solo después de completar una solicitud RIOSend(Ex) en vuelo, debe volver a usar la misma PRIO_BUF (ya sea con el mismo desplazamiento o con un desplazamiento y una longitud diferentes). Además, cuando los datos de envío hacen referencia a un búfer registrado (ya sea una parte o todo el búfer), no se debe usar todo el búfer registrado hasta que se haya completado el envío. Esto incluye el uso de una parte del búfer registrado para una operación de recepción u otra operación de envío.

El parámetro pLocalAddress se puede usar para recuperar la dirección local desde la que se enviaron los datos. El parámetro pRemoteAddress se puede usar para recuperar la dirección remota a la que se enviaron los datos. Las direcciones locales y remotas se devuelven como estructuras de SOCKADDR_INET . Como resultado, el miembro Length del RIO_BUF apuntado por los parámetros pLocalAddress o pRemoteAddress debe ser igual o mayor que el tamaño de una estructura de SOCKADDR_INET .

En la tabla siguiente se resumen los distintos usos de datos de control disponibles para su uso con la información de control en el miembro pControlContext .

Protocolo cmsg_level cmsg_type Descripción
IPv4 IPPROTO_IP IP_PKTINFO Especifica o recibe información de paquetes.
Para obtener más información, consulte IPPROTO_IP Opciones de socket para la opción de socket IP_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_DSTOPTS Especifica o recibe opciones de destino.
IPv6 IPPROTO_IPV6 IPV6_HOPLIMIT Especifica o recibe el límite de saltos.
Para obtener más información, consulte IPPROTO_IPV6 Opciones de socket para la opción de socket IPV6_HOPLIMIT.
IPv6 IPPROTO_IPV6 IPV6_HOPOPTS Especifica o recibe opciones de salto a salto.
IPv6 IPPROTO_IPV6 IPV6_NEXTHOP Especifica la dirección del próximo salto.
IPv6 IPPROTO_IPV6 IPV6_PKTINFO Especifica o recibe información de paquetes.
Para obtener más información, consulte las opciones de socket IPPROTO_IPV6 para la opción de socket IPV6_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_RTHDR Especifica o recibe el encabezado de enrutamiento.

Los datos de control se componen de uno o varios objetos de datos de control, cada uno de los cuales comienza con una estructura WSACMSGHDR , definida como la siguiente:

} WSACMSGHDR;

Los miembros de la estructura WSACMSGHDR son los siguientes:

Término Descripción
cmsg_len Número de bytes de datos que comienzan desde el principio del WSACMSGHDR hasta el final de los datos (excepto los bytes de relleno que pueden seguir los datos).
cmsg_level Protocolo que originó la información de control.
cmsg_type Tipo específico del protocolo de información de control.

El parámetro Flags se puede usar para influir en el comportamiento de la función RIOSendEx más allá de las opciones especificadas para el socket asociado. El comportamiento de esta función viene determinado por una combinación de las opciones de socket establecidas en el socket asociado al parámetro SocketQueue y los valores especificados en el parámetro Flags .

Nota

El puntero de función a la función RIOSendEx debe obtenerse en tiempo de ejecución realizando una llamada a la función WSAIoctl con el código de operación SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER especificado. El búfer de entrada pasado a la función WSAIoctl debe contener WSAID_MULTIPLE_RIO, un identificador único global (GUID) cuyo valor identifica las funciones de extensión de E/S registradas de Winsock. Si se ejecuta correctamente, la salida devuela por la función WSAIoctl contiene un puntero a la estructura de RIO_EXTENSION_FUNCTION_TABLE que contiene punteros a las funciones de extensión de E/S registradas de Winsock. El SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL se define en el archivo de encabezado Ws2def.h . El GUID de WSAID_MULTIPLE_RIO se define en el archivo de encabezado Mswsock.h .

Windows Phone 8: esta función es compatible con las aplicaciones de Windows Phone Store en Windows Phone 8 y versiones posteriores.

Windows 8.1 y Windows Server 2012 R2: esta función es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.

Requisitos

Requisito Valor
Header mswsock.h