Función de devolución de llamada LPWSPCANCELBLOCKINGCALL (ws2spi.h)

La función LPWSPCancelBlockingCall cancela una llamada de bloqueo que está actualmente en curso.

Sintaxis

LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;

int Lpwspcancelblockingcall(
  [out] LPINT lpErrno
)
{...}

Parámetros

[out] lpErrno

Puntero al código de error.

Valor devuelto

El valor devuelto por LPWSPCancelBlockingCall es cero si la operación se canceló correctamente. De lo contrario, se devuelve el valor SOCKET_ERROR y hay disponible un código de error específico en lpErrno.

Código de error Significado
WSAENETDOWN
Error en el subsistema de red.
WSAEINVAL
Indica que no hay ninguna llamada de bloqueo pendiente.

Comentarios

Esta función cancela cualquier operación de bloqueo pendiente para este subproceso. Normalmente se usa en dos situaciones:

  • Un cliente SPI de Windows Sockets está procesando un mensaje que se ha recibido mientras un proveedor de servicios implementa el pseudobloqueo. En este caso, WSAIsBlocking será true.
  • Una llamada de bloqueo está en curso y el proveedor de servicios winsock ha llamado de vuelta a la función de enlace de bloqueo del cliente SPI de Winsock (a través de la función de devolución de llamada recuperada de WPUQueryBlockingCallback), que a su vez invoca esta función. Tal situación puede surgir, por ejemplo, al implementar una opción Cancelar para una operación que requiere un tiempo prolongado para completarse.

En cada caso, la llamada de bloqueo original finalizará lo antes posible con el error WSAEINTR. (En la primera instancia, la finalización no tendrá lugar hasta que la programación de mensajes de Windows haya provocado que el control vuelva a la rutina de pseudo bloqueo en Winsock. En la segunda instancia, la llamada de bloqueo se finalizará en cuanto se complete la función de enlace de bloqueo).

En el caso de una operación LPWSPConnect de bloqueo, Winsock finalizará la llamada de bloqueo lo antes posible, pero no es posible que los recursos de socket se liberen hasta que se haya completado la conexión (y luego se haya restablecido) o se agote el tiempo de espera. Esto es probable que solo sea notable si el cliente SPI de Winsock intenta abrir inmediatamente un nuevo socket (si no hay sockets disponibles) o para conectarse al mismo par a través de una llamada LPWSPConnect .

La cancelación de un LPWSPAccept o una llamada LPWSPSelect no afecta negativamente a los sockets pasados a estas llamadas. Solo se produce un error en la llamada concreta; cualquier operación que fuera legal antes de la cancelación es legal después de la cancelación, y el estado del socket no se ve afectado de ninguna manera.

Cancelar cualquier operación distinta de LPWSPAccept y LPWSPSelect puede dejar el socket en un estado indeterminado. Si un cliente SPI de Winsock cancela una operación de bloqueo en un socket, la única operación que el cliente WINSock SPI podrá realizar en el socket es una llamada a LPWSPCloseSocket, aunque otras operaciones pueden funcionar en algunos proveedores de servicios winsock. Si un cliente winsock SPI requiere la portabilidad máxima, debe tener cuidado de no depender de realizar operaciones después de una operación de cancelación. Un cliente SPI de Winsock puede restablecer la conexión estableciendo el tiempo de espera en SO_LINGER en cero y llamando a LPWSPCloseSocket.

Si una operación de cancelación ha puesto en peligro la integridad del flujo de datos de un SOCK_STREAM de cualquier manera, el proveedor winsock restablecerá la conexión y producirá un error en todas las operaciones futuras que no sean LPWSPCloseSocket con WSAECONNABORTED.

Es aceptable que LPWSPCancelBlockingCall se devuelva correctamente si la operación de bloqueo de red se completa antes de cancelarse. En este caso, la operación de bloqueo devolverá correctamente como si nunca se hubiera llamado a LPWSPCancelBlockingCall . La única manera de que el cliente SPI de Winsock confirme que una operación se canceló realmente es comprobar si hay un código de retorno de WSAEINTR desde la llamada de bloqueo.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Encabezado ws2spi.h

Consulte también

WPUQueryBlockingCallback

WSAIsBlocking

LPWSPAccept

LPWSPCloseSocket

LPWSPSelect

LPWSPSocket