Función WPUCompleteOverlappedRequest (ws2spi.h)
La función WPUCompleteOverlappedRequest realiza una notificación de finalización de E/S superpuesta para las operaciones de E/S superpuestas.
int WPUCompleteOverlappedRequest(
[in] SOCKET s,
[in] LPWSAOVERLAPPED lpOverlapped,
[in] DWORD dwError,
[in] DWORD cbTransferred,
[out] LPINT lpErrno
);
[in] s
Socket del proveedor de servicios creado por WPUCreateSocketHandle.
[in] lpOverlapped
Puntero a una estructura WSAOVERLAPPED asociada a la operación de E/S superpuesta cuya finalización se va a notificar.
[in] dwError
Estado de finalización de la operación de E/S superpuesta cuya finalización se va a notificar.
[in] cbTransferred
El número de bytes transferidos a o desde búferes de cliente (la dirección de la transferencia depende de la naturaleza de envío o recepción de la operación de E/S superpuesta cuya finalización se va a notificar).
[out] lpErrno
Puntero al código de error resultante de la ejecución de esta función.
Si no se produce ningún error, WPUCompleteOverlappedRequest devuelve cero y notifica a la finalización de la operación de E/S superpuesta según el mecanismo seleccionado por el cliente (indica un evento encontrado en la estructura WSAOVERLAPPED a la que hace referencia lpOverlapped o pone en cola un informe de estado de finalización al puerto de finalización asociado al socket si está asociado un puerto de finalización). De lo contrario, WPUCompleteOverlappedRequest devuelve SOCKET_ERROR y un código de error específico está disponible en lpErrno.
Código de error | Significado |
---|---|
El socket pasado en el parámetro s no es un socket creado por WPUCreateSocketHandle. |
La función WPUCompleteOverlappedRequest realiza una notificación de finalización de E/S superpuesta para operaciones de E/S superpuestas en las que el mecanismo de finalización especificado por el cliente es algo distinto de la llamada a procedimiento asincrónico del modo de usuario (APC). Esta función solo se puede usar para los identificadores de socket creados por WPUCreateSocketHandle.
Si el cliente selecciona un APC en modo de usuario como método de notificación, el proveedor de servicios debe usar WPUQueueApc u otra función de sistema operativo adecuada para realizar la notificación de finalización. Si el cliente no selecciona APC en modo de usuario, un proveedor de servicios que no implementa la funcionalidad IFS directamente no puede determinar si el cliente ha asociado o no un puerto de finalización con el identificador de socket. Por lo tanto, no puede determinar si el método de notificación de finalización debe poner en cola un registro de estado de finalización en un puerto de finalización o indicar un evento encontrado en la estructura WSAOVERLAPPED . La arquitectura de Windows Socket 2 realiza un seguimiento de cualquier asociación de puerto de finalización con un socket creado por WPUCreateSocketHandle y puede tomar una decisión correcta entre la notificación basada en puertos de finalización o la notificación basada en eventos.
Cuando WPUCompleteOverlappedRequest pone en cola una indicación de finalización, establece el miembro InternalHigh de la estructura WSAOVERLAPPED en el recuento de bytes transferidos. A continuación, establece el miembro Interno en algún valor dependiente del sistema operativo distinto del valor especial WSS_OPERATION_IN_PROGRESS. Puede haber algún ligero retraso después de que WPUCompleteOverlappedRequest devuelva antes de que aparezcan estos valores, ya que el procesamiento puede producirse de forma asincrónica. Sin embargo, se garantiza que el valor InternalHigh (recuento de bytes) se establece en el momento en que se establece Internal.
WPUCompleteOverlappedRequest funciona como se indica (realiza la notificación de finalización solicitada por el cliente) si el controlador de socket se ha asociado o no a un puerto de finalización.
Interacción con WSPGetOverlappedResult
El comportamiento de WPUCompleteOverlappedRequest coloca algunas restricciones sobre cómo un proveedor de servicios implementa WSPGetOverlappedResult , ya que solo los miembros Offset y OffsetHigh de la estructura WSAOVERLAPPED se controlan exclusivamente por el proveedor de servicios, pero el proveedor de servicios debe recuperar tres valores (recuento de bytes, marcas y errores) de la estructura mediante WSPGetOverlappedResult. Un proveedor de servicios puede hacerlo de cualquier manera que elija siempre que interactúe con el comportamiento de WPUCompleteOverlappedRequest correctamente. Sin embargo, una implementación típica es la siguiente:
- Al principio del procesamiento superpuesto, el proveedor de servicios establece Internal en WSS_OPERATION_IN_PROGRESS.
- Cuando se ha completado la operación de E/S, el proveedor establece OffsetHigh en el código de error de Windows Socket 2 resultante de la operación, establece Offset en las marcas resultantes de la operación de E/S y llama a WPUCompleteOverlappedRequest, pasando el recuento de bytes de transferencia como uno de los parámetros. WPUCompleteOverlappedRequest finalmente establece InternalHigh en el recuento de bytes de transferencia y, a continuación, establece Internal en un valor distinto de WSS_OPERATION_IN_PROGRESS.
- Cuando se llama a WSPGetOverlappedResult , el proveedor de servicios comprueba Interno. Si es WSS_OPERATION_IN_PROGRESS, el proveedor espera el identificador de eventos en el miembro hEvent o devuelve un error, en función de la configuración de la marca FWAIT de WSPGetOverlappedResult. Si no está en curso o después de la finalización de la espera, el proveedor devuelve los valores de InternalHigh, OffsetHigh y Offset como recuento de transferencias, código de error de resultado de la operación y marcas, respectivamente.
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 2000 Professional [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows 2000 Server [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | ws2spi.h |