Compartir a través de


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.

Syntax

int WPUCompleteOverlappedRequest(
  [in]  SOCKET          s,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  DWORD           dwError,
  [in]  DWORD           cbTransferred,
  [out] LPINT           lpErrno
);

Parámetros

[in] s

El 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.

Valor devuelto

Si no se produce ningún error, WPUCompleteOverlappedRequest devuelve cero y notifica 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 hay disponible un código de error específico en lpErrno.

Código de error Meaning
WSAEINVAL
El socket pasado en el parámetro s no es un socket creado por WPUCreateSocketHandle.

Observaciones

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 (APC) del modo de usuario. Esta función solo se puede usar para los identificadores de socket creados por WPUCreateSocketHandle.

**Nota** Esta función es diferente de otras funciones con el prefijo "WPU" en que no se tiene acceso a ella a través de la tabla upcall. En su lugar, se exporta directamente mediante Ws2_32.dll. Los proveedores de servicios que necesitan llamar a esta función deben vincularse con WS2_32.lib o usar las funciones adecuadas del sistema operativo, como LoadLibrary y GetProcAddress para recuperar el puntero de función.
 
Los proveedores de servicios que no implementan la función **WPUCompleteOverlappedRequest** usan la función **WPUCompleteOverlappedRequest** que no implementan la funcionalidad del sistema de archivos instalable (IFS) directamente para los identificadores de socket que exponen. Realiza una notificación de finalización para cualquier solicitud de E/S superpuesta para la que la notificación de finalización especificada no sea un APC en modo de usuario. **WPUCompleteOverlappedRequest** solo se admite para los identificadores de socket creados por WPUCreateSocketHandle y no para sockets creados por un proveedor de servicios directamente.

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 que no sea el valor especial WSS_OPERATION_IN_PROGRESS. Puede haber un pequeño 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 establezca 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 identificador de socket se ha asociado o no a un puerto de finalización.

Interacción con WSPGetOverlappedResult

El comportamiento de WPUCompleteOverlappedRequest coloca algunas restricciones en la forma en que 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 por WSPGetOverlappedResult. Un proveedor de servicios puede lograr esto 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.
  • Una vez completada 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 se WSS_OPERATION_IN_PROGRESS, el proveedor espera el identificador de eventos en el miembro hEvent o devuelve un error, en función del valor 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.

Requisitos

Requirement Importancia
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo admitido Windows 2000 Server [solo aplicaciones de escritorio]
de la plataforma de destino de Windows
Header ws2spi.h
Library mincore.lib

Consulte también

WPUCreateSocketHandle

WPUQueueApc

WSAOVERLAPPED

WSPGetOverlappedResult