LPFN_RIONOTIFY función de devolución de llamada (mswsock.h)
La función RIONotify registra el método que se va a usar para el comportamiento de notificación con una cola de finalización de E/S para su uso con las extensiones de E/S registradas de Winsock.
Sintaxis
LPFN_RIONOTIFY LpfnRionotify;
INT LpfnRionotify(
RIO_CQ CQ
)
{...}
Parámetros
CQ
Descriptor que identifica una cola de finalización de E/S.
Valor devuelto
Si no se produce ningún error, la función RIONotify devuelve ERROR_SUCCESS. De lo contrario, se produce un error en la función y se devuelve un código de error específico.
Código devuelto | Descripción |
---|---|
Se pasó un parámetro no válido a la función. Este error se devuelve si se pasa la cola de finalización no válida en el parámetro CQ (RIO_INVALID_CQ, por ejemplo). Este error también se puede devolver cuando se produce un error interno. |
|
Se ha intentado una operación en un socket que no es de bloqueo y que ya tenía una operación en marcha. Este error se devuelve si aún no se ha completado una solicitud RIONotify anterior. |
Comentarios
La función RIONotify registra el método que se va a usar para el comportamiento de notificación para enviar o recibir datos de red con las extensiones de E/S registradas de Winsock.
La función RIONotify es el mecanismo por el que una aplicación descubre que las solicitudes se completan y están esperando una llamada a la función RIODequeueCompletion . La función RIONotify establece el método que se usará para el comportamiento de notificación cuando una cola de finalización de E/S no está vacía y contiene la finalización de un resultado.
El comportamiento de notificación de una cola de finalización se establece cuando se crea el RIO_CQ . La estructura RIO_NOTIFICATION_COMPLETION se pasa a la función RIOCreateCompletionQueue cuando se crea un RIO_CQ .
Para una cola de finalización que usa un evento, el miembro Type de la estructura RIO_NOTIFICATION_COMPLETION se establece en RIO_EVENT_COMPLETION. El miembro Event.EventHandle debe contener el identificador de un evento creado por la función WSACreateEvent o CreateEvent . Para recibir la finalización de RIONotify , la aplicación debe esperar al identificador de eventos especificado mediante WSAWaitForMultipleEvents o una rutina de espera similar. Si la aplicación planea restablecer y reutilizar el evento, la aplicación puede reducir la sobrecarga estableciendo el miembro Event.NotifyReset en un valor distinto de cero. Esto hace que la función RIONotify restablezca automáticamente el evento cuando se produzca la notificación. Esto mitiga la necesidad de llamar a la función WSAResetEvent para restablecer el evento entre llamadas a la función RIONotify .
Cuando se llama a la función RIONotify , se usa la finalización de eventos y la cola de finalización especificada aún no está vacía, el evento se establece de forma sincrónica o asincrónica. En ambos casos, no es necesario escribir entradas adicionales en la cola de finalización antes de establecer el evento. Hasta que la cola de finalización contiene la finalización de una solicitud que no tenía establecida la marca RIO_MSG_DONT_NOTIFY , la cola de finalización se considera vacía para los fines de la función RIONotify y el evento no está establecido. Las solicitudes completadas todavía se pueden recuperar mediante la función RIODequeueCompletion . Cuando se establece el evento, la aplicación normalmente llama a la función RIODequeueCompletion para quitar de la cola las solicitudes de envío y recepción completadas.
Para una cola de finalización que usa un puerto de finalización de E/S, el miembro Type de la estructura de RIO_NOTIFICATION_COMPLETION se establece en RIO_IOCP_COMPLETION. El miembro Iocp.IocpHandle debe contener el identificador de un puerto de finalización de E/S creado por la función CreateIoCompletionPort . Para recibir la finalización de RIONotify , la aplicación debe llamar a la función GetQueuedCompletionStatus o GetQueuedCompletionStatusEx . La aplicación debe proporcionar un objeto SUPERPUESTO dedicado para la cola de finalización y también puede usar el miembro Iocp.CompletionKey para distinguir las solicitudes RIONotify en la cola de finalización de otras finalizaciones de E/S, incluidas las finalizaciones RIONotify para otras colas de finalización.
Una aplicación que usa grupos de subprocesos puede usar objetos de espera de grupo de subprocesos para obtener finalizaciones rioNotify a través de su grupo de subprocesos. En ese caso, la llamada a la función SetThreadpoolWait debe seguir inmediatamente la llamada a RIONotify. Si se llama a la función SetThreadpoolWait antes de RIONotify y la aplicación se basa en RIONotify para borrar el objeto de evento, esto puede dar lugar a ejecuciones falsas de la devolución de llamada del objeto de espera.
Nota
El puntero de función a la función RIONotify debe obtenerse en tiempo de ejecución realizando una llamada a la función WSAIoctl con el SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER código de operación 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 devuelta por la función WSAIoctl contiene un puntero a la estructura 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.
Seguridad para subprocesos
Si varios subprocesos intentan acceder al mismo RIO_CQ mediante la función RIODequeueCompletion , el acceso debe coordinarse mediante una sección crítica, un bloqueo de escritura de lector delgado o un mecanismo de exclusión mutua similar. Si las colas de finalización no se comparten, no se requiere la exclusión mutua.
Requisitos
Requisito | Valor |
---|---|
Header | mswsock.h |