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

La función RIOCreateRequestQueue crea un descriptor de socket de E/S registrado mediante una cola de finalización de E/S y socket especificadas para su uso con las extensiones de E/S registradas de Winsock.

Sintaxis

LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;

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

Parámetros

Socket

Descriptor que identifica el socket.

MaxOutstandingReceive

Número máximo de recepciones pendientes permitidas en el socket.

Este parámetro suele ser un número pequeño para la mayoría de las aplicaciones.

MaxReceiveDataBuffers

Número máximo de búferes de datos de recepción en el socket.

Nota

Para Windows 8 y Windows Server 2012 , este parámetro debe ser 1.

MaxOutstandingSend

Número máximo de envíos pendientes permitidos en el socket.

MaxSendDataBuffers

Número máximo de búferes de datos de envío en el socket.

Nota

Para Windows 8 y Windows Server 2012 , este parámetro debe ser 1.

ReceiveCQ

Descriptor que identifica la cola de finalización de E/S que se va a usar para las finalizaciones de solicitudes de recepción.

SendCQ

Descriptor que identifica la cola de finalización de E/S que se va a usar para las finalizaciones de solicitudes de envío.

Este parámetro puede tener el mismo valor que el parámetro ReceiveCQ .

SocketContext

Contexto de socket que se va a asociar a esta cola de solicitudes.

Valor devuelto

Si no se produce ningún error, la función RIOCreateRequestQueue devuelve un descriptor que hace referencia a una nueva cola de solicitudes. De lo contrario, se devuelve un valor de RIO_INVALID_RQ y se puede recuperar un código de error específico llamando a la función WSAGetLastError .

Código devuelto Descripción
WSAEINVAL
Se pasó un parámetro no válido a la función.
Este error se devuelve si los parámetros ReceiveCQ o SendCQ contienen RIO_INVALID_CQ. Este error se devuelve si los parámetros MaxOutstandingReceive y MaxOutstandingSend son cero. Este error también se devuelve si el socket pasado en el parámetro Socket está en proceso de inicialización o cierre.
WSAENOBUFS
No se pudo asignar memoria suficiente. Este error se devuelve si no había memoria suficiente para asignar la cola de solicitudes en función de los parámetros. Este error también se devuelve si se superó el límite de sesión de red.
WSAENOTSOCK
El descriptor no es un socket. Este error se devuelve si el parámetro Socket no es un socket válido.
WSAEOPNOTSUPP
La operación intentada no se admite para el tipo de objeto al que se hace referencia. Este error se devuelve para un socket en el parámetro Socket para un tipo de socket no admitido (por ejemplo, SOCK_RAW).

Comentarios

La función RIOCreateRequestQueue crea un descriptor de socket de E/S registrado mediante una cola de finalización de E/S y socket especificada. Una aplicación debe llamar a RIOCreateRequestQueue para obtener una RIO_RQ para un socket Winsock antes de que la aplicación pueda usar las funciones RIOSend, RIOSendEx, RIOReceive o RIOReceiveEx. Para obtener un RIO_RQ, el socket Winsock debe estar asociado a las colas de finalización para enviar y recibir, aunque se puede usar la misma cola de finalización para ambos.

Debido al tamaño finito de las colas de finalización, un socket solo puede estar asociado a una cola de finalización para las operaciones de envío y recepción si garantiza que no supere la capacidad de las finalizaciones en cola totales. Por lo tanto, la llamada a la función RIOCreateRequestQueue establece límites específicos del socket. Estos límites se usan durante la llamada RIOCreateRequestQueue para comprobar el espacio suficiente en las colas de finalización para dar cabida a las solicitudes de socket y durante el tiempo de inicio de la solicitud para asegurarse de que la solicitud no hace que el socket supere sus límites.

Las colas de envío y recepción se pueden asociar a varios sockets. Los tamaños de las colas de envío y recepción deben ser mayores o iguales que los tamaños de envío y recepción de todos los sockets adjuntos. A medida que las colas de solicitudes se cierran cerrando los sockets mediante la función closesocket , esas ranuras se liberarán para su uso por otros sockets.

Nota

Con fines de eficacia, el acceso a las colas de finalización (RIO_CQ estructuras) y las colas de solicitudes (RIO_RQ estructuras) no están protegidos por primitivos de sincronización. Si necesita acceder a una cola de finalización o solicitud desde varios subprocesos, el acceso debe coordinarse mediante una sección crítica, un bloqueo de escritura de lector delgado o un mecanismo similar. Este bloqueo no es necesario para el acceso mediante un único subproceso. Diferentes subprocesos pueden acceder a solicitudes o colas de finalización independientes sin bloqueos. La necesidad de sincronización solo se produce cuando varios subprocesos intentan acceder a la misma cola. La sincronización también es necesaria si varios subprocesos se envían y reciben en el mismo socket porque las operaciones de envío y recepción usan la cola de solicitudes del socket.

 

Cuando una aplicación termine de usar el RIO_RQ, la aplicación debe llamar a la función closesocket para cerrar el socket y liberar los recursos asociados.

Nota

El puntero de función a la función RIOCreateRequestQueue se debe obtener 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