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

La función LPWSPCloseSocket cierra un socket.

Sintaxis

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

Parámetros

[in] s

Descriptor que identifica un socket.

[out] lpErrno

Puntero al código de error.

Valor devuelto

Si no se produce ningún error, LPWSPCloseSocket devuelve cero. De lo contrario, se devuelve un valor de 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.
WSAEINPROGRESS
El bloqueo de la llamada a Windows Sockets está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAENOTSOCK
El descriptor no es un socket.
WSAEWOULDBLOCK
El socket se marca como sin bloqueo y SO_LINGER se establece en un valor de tiempo de espera distinto de cero.

Comentarios

Esta función cierra un socket. Más precisamente, libera el descriptor de socket s, por lo que se deben producir errores en las referencias adicionales a s con el error WSAENOTSOCK. Si esta es la última referencia a un socket subyacente, se descartan la información de nomenclatura asociada y los datos en cola. Las llamadas asincrónicas o de bloqueo pendientes en el socket (emitidos por cualquier subproceso de este proceso) se cancelan sin publicar ningún mensaje de notificación. Las operaciones superpuestas pendientes emitidas por cualquier subproceso de este proceso también se cancelan. Cualquier acción de finalización especificada para estas operaciones superpuestas se realiza (por ejemplo, evento, rutina de finalización o puerto de finalización). En este caso, las operaciones superpuestas pendientes producen un error con el estado de error WSA_OPERATION_ABORTED . FD_CLOSE no se publicará después de llamar a LPWSPCloseSocket .

El comportamiento de LPWSPCloseSocket se resume de la siguiente manera:

  • Si SO_DONTLINGER está habilitado (la configuración predeterminada), LPWSPCloseSocket devuelve inmediatamente y la conexión se cierra correctamente en segundo plano.

  • Si SO_LINGER está habilitado con un tiempo de espera cero, LPWSPCloseSocket devuelve inmediatamente y la conexión se restablece o finaliza.

    o

  • Si SO_LINGER está habilitado con un tiempo de espera distinto de cero con un socket de bloqueo, LPWSPCloseSocket se bloquea hasta que se envíen todos los datos o expire el tiempo de espera.

  • Si SO_LINGER está habilitado con un tiempo de espera distinto de cero con un socket de no bloqueo, LPWSPCloseSocket devuelve inmediatamente, lo que indica un error.

La semántica de LPWSPCloseSocket se ve afectada por las opciones de socket SO_LINGER y SO_DONTLINGER de la siguiente manera.

Opción Intervalo Tipo de cierre ¿Espera a cerrar?
SO_DONTLINGER No le importa Estable No
SO_LINGER Cero Difícil No
SO_LINGER Distinto a cero Estable

 

 

Si se establece SO_LINGER (es decir, el miembro l_onoff de la estructura persistente es distinto de cero) y el intervalo de tiempo de espera, l_linger, es cero, LPWSPCloseSocket no se bloquea incluso si aún no se han enviado o confirmado los datos en cola. Esto se denomina cierre duro o abortivo, porque el circuito virtual del socket se restablece inmediatamente y se pierden los datos no enviados. Cualquier llamada LPWSPRecv en el lado remoto del circuito producirá un error con WSAECONNRESET.

Si SO_LINGER se establece con un intervalo de tiempo de espera distinto de cero en un socket de bloqueo, la llamada LPWSPCloseSocket se bloquea en un socket de bloqueo hasta que se envíen los datos restantes o hasta que expire el tiempo de espera. Esto se denomina desconexión correcta. Si el tiempo de espera expira antes de que se hayan enviado todos los datos, el proveedor de servicios debe finalizar la conexión antes de que se devuelva LPWSPCloseSocket .

No se recomienda habilitar SO_LINGER con un intervalo de tiempo de espera distinto de cero en un socket sin bloqueo. En este caso, la llamada a LPWSPCloseSocket producirá un error de WSAEWOULDBLOCK si la operación de cierre no se puede completar inmediatamente. Si LPWSPCloseSocket produce un error con WSAEWOULDBLOCK, el controlador de socket sigue siendo válido y no se inicia una desconexión.

El cliente WINSOCK SPI debe llamar a LPWSPCloseSocket de nuevo para cerrar el socket, aunque LPWSPCloseSocket puede seguir produciendo un error a menos que el cliente SPI de Winsock realice una de las siguientes acciones:

  • Deshabilita SO_DONTLINGER.
  • Habilita SO_LINGER con un tiempo de espera cero.
  • Llama a LPWSPShutdown para iniciar el cierre.

Si SO_DONTLINGER se establece en un socket de flujo (es decir, el miembro l_onoff de la estructura persistente es cero), la llamada LPWSPCloseSocket devolverá inmediatamente y no obtiene WSAEWOULDBLOCK, si el socket está bloqueando o no bloqueando. Sin embargo, los datos en cola para la transmisión se enviarán si es posible antes de que se cierre el socket subyacente. Esto se denomina desconexión correcta y es el comportamiento predeterminado.

Tenga en cuenta que, en este caso, el proveedor winsock puede conservar los recursos asociados al socket hasta que se haya completado la desconexión correcta o el proveedor finalice la conexión debido a la incapacidad de completar la operación en un período de tiempo determinado por el proveedor. Esto puede afectar a los clientes winsock que esperan usar todos los sockets disponibles. Este es el comportamiento predeterminado; SO_DONTLINGER se establece de forma predeterminada.

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

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket