Compartir a través de


Función closesocket (winsock.h)

La función closesocket cierra un socket existente.

Sintaxis

int closesocket(
  [in] SOCKET s
);

Parámetros

[in] s

Descriptor que identifica el socket que se va a cerrar.

Valor devuelto

Si no se produce ningún error, closesocket devuelve cero. De lo contrario, se devuelve un valor de SOCKET_ERROR y se puede recuperar un código de error específico llamando a WSAGetLastError.

Código de error Significado
WSANOTINITIALISED
Debe producirse una llamada de WSAStartup correcta antes de usar esta función.
WSAENETDOWN
Error en el subsistema de red.
WSAENOTSOCK
El descriptor no es un socket.
WSAEINPROGRESS
Una llamada de Bloqueo de Windows Sockets 1.1 está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAEINTR
La llamada a Windows Socket 1.1 (bloqueo) se canceló a través de WSACancelBlockingCall.
WSAEWOULDBLOCK
El socket se marca como desbloqueo, pero el miembro l_onoff de la estructura persistente se establece en distinto de cero y el miembro l_linger de la estructura de persistencia se establece en un valor de tiempo de espera distinto de cero.

Comentarios

La función closesocket cierra un socket. Úselo para liberar el descriptor de socket pasado en el parámetro s . Tenga en cuenta que el descriptor de socket pasado en el parámetro s puede volver a usarse inmediatamente por el sistema en cuanto se emita la función closesocket . Como resultado, no es confiable esperar más referencias al descriptor de socket pasado en el parámetro s para producir el error WSAENOTSOCK. Un cliente winsock nunca debe emitir closesocketal mismo tiempo con otra llamada de función de Winsock.

Las operaciones de envío y recepción superpuestas pendientes ( WSASend/ WSASendTo/ WSARecv/ WSARecvFrom con un socket superpuesto) emitido por cualquier subproceso de este proceso también se cancela. Se realiza cualquier evento, rutina de finalización o acción de puerto de finalización especificada para estas operaciones superpuestas. Las operaciones superpuestas pendientes producen un error con el estado de error WSA_OPERATION_ABORTED.

Una aplicación no debe suponer que todas las operaciones de E/S pendientes en un socket se garantizarán que se completen cuando closesocket devuelva. La función closesocket iniciará la cancelación en las operaciones de E/S pendientes, pero eso no significa que una aplicación recibirá la finalización de E/S para estas operaciones de E/S cuando la función closesocket devuelva. Por lo tanto, una aplicación no debe limpiar ningún recurso (estructuras WSAOVERLAPPED , por ejemplo) a los que hacen referencia las solicitudes de E/S pendientes hasta que se completen las solicitudes de E/S.

Una aplicación siempre debe tener una llamada coincidente para closesocket para cada llamada correcta al socket para devolver los recursos de socket al sistema.

La estructura persistente mantiene información sobre un socket específico que especifica cómo debe comportarse ese socket cuando se ponen en cola los datos que se van a enviar y se llama a la función closesocket en el socket.

El miembro l_onoff de la estructura persistente determina si un socket debe permanecer abierto durante un período de tiempo especificado después de una llamada de función closesocket para permitir que se envíen los datos en cola. Este miembro se puede modificar de dos maneras:

  • Llame a la función setsockopt con el parámetro optname establecido en SO_DONTLINGER. El parámetro optval determina cómo se modifica el miembro de l_onoff .
  • Llame a la función setsockopt con el parámetro optname establecido en SO_LINGER. El parámetro optval especifica cómo se modifican los miembros l_onoff y l_linger .

El l_linger miembro de la estructura persistente determina la cantidad de tiempo, en segundos, que un socket debe permanecer abierto. Este miembro solo es aplicable si el l_onoff miembro de la estructura persistente es distinto de cero.

Los parámetros predeterminados de un socket son el miembro l_onoff de la estructura persistente es cero, lo que indica que el socket no debe permanecer abierto. El valor predeterminado para el miembro l_linger de la estructura persistente es cero, pero este valor se omite cuando el miembro l_onoff se establece en cero.

Para permitir que un socket permanezca abierto, una aplicación debe establecer el miembro l_onoff en un valor distinto de cero y establecer el miembro l_linger en el tiempo de espera deseado en segundos. Para deshabilitar un socket del resto abierto, una aplicación solo debe establecer el miembro l_onoff de la estructura persistente en cero.

Si una aplicación llama a la función setsockopt con el parámetro optname establecido en SO_DONTLINGER para establecer el miembro l_onoff en un valor distinto de cero, no se especifica el valor del miembro l_linger . En este caso, el tiempo de espera usado depende de la implementación. Si se ha establecido un tiempo de espera anterior para un socket (llamando previamente a la función setsockopt con el parámetro optname establecido en SO_LINGER), el proveedor de servicios debe restablecer este valor de tiempo de espera.

La semántica de la función closesocket se ve afectada por las opciones de socket que establecen miembros de la estructura persistente .

l_onoff l_linger Tipo de cierre ¿Espera a cerrar?
cero No le importa Cierre elegante No
Distinto cero Difícil No
Distinto Distinto Con gracia si todos los datos se envían dentro del valor de tiempo de espera especificado en el miembro l_linger .

Duro si no se pudieron enviar todos los datos dentro del valor de tiempo de espera especificado en el miembro l_linger .

 

Si el miembro l_onoff de la estructura LINGER es cero en un socket de flujo, la llamada closesocket devolverá inmediatamente y no recibirá 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 también se denomina desconexión o cierre con gracia. En este caso, el proveedor de Windows Sockets no puede liberar el socket y otros recursos durante un período arbitrario, lo que afecta a las aplicaciones que esperan usar todos los sockets disponibles. Este es el comportamiento predeterminado de un socket.

Si el miembro l_onoff de la estructura persistente es distinto de cero y l_linger miembro es cero, closesocket 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. En Windows, cualquier llamada a recv en el lado remoto del circuito producirá un error con WSAECONNRESET.

Si el miembro l_onoff de la estructura persistente se establece en distinto de cero y l_linger miembro se establece en un tiempo de espera distinto de cero en un socket de bloqueo, la llamada closesocket se bloquea hasta que se hayan enviado los datos restantes o hasta que expire el tiempo de espera. Esto se denomina desconexión correcta o cierre si todos los datos se envían dentro del valor de tiempo de espera especificado en el miembro l_linger . Si el tiempo de espera expira antes de que se hayan enviado todos los datos, la implementación de Windows Sockets finaliza la conexión antes de que closesocket devuelva y se denomina cierre duro o anulativo.

No se recomienda establecer el miembro l_onoff de la estructura persistente en distinto de cero y el miembro l_linger con un intervalo de tiempo de espera distinto de cero en un socket sin bloqueo. En este caso, la llamada a closesocket producirá un error de WSAEWOULDBLOCK si la operación de cierre no se puede completar inmediatamente. Si closesocket produce un error con WSAEWOULDBLOCK , el controlador de socket sigue siendo válido y no se inicia una desconexión. La aplicación debe llamar a closesocket de nuevo para cerrar el socket.

Si el miembro l_onoff de la estructura persistente no es cero y el miembro l_linger es un intervalo de tiempo de espera distinto de cero en un socket de bloqueo, el resultado de la función closesocket no se puede usar para determinar si todos los datos se han enviado al mismo nivel. Si los datos se envían antes de que expire el tiempo de espera especificado en el miembro l_linger o si se anuló la conexión, la función closesocket no devolverá un código de error (el valor devuelto de la función closesocket es cero).

La llamada a closesocket solo se bloqueará hasta que todos los datos se hayan entregado al mismo nivel o expire el tiempo de espera. Si la conexión se restablece porque expira el tiempo de espera, el socket no entrará en TIME_WAIT estado. Si se envían todos los datos dentro del período de tiempo de espera, el socket puede entrar en TIME_WAIT estado.

Si el miembro l_onoff de la estructura persistente es distinto de cero y el miembro l_linger es un intervalo de tiempo de espera cero en un socket de bloqueo, una llamada a closesocket restablecerá la conexión. El socket no irá al estado TIME_WAIT.

Se puede llamar a la función getockopt con el parámetro optname establecido en SO_LINGER para recuperar el valor actual de la estructura persistente asociada a un socket.

Nota Para asegurarse de que todos los datos se envían y reciben en una conexión, una aplicación debe llamar al apagado antes de llamar a Closesocket (consulte Cierre correcto, opciones persistentes y cierre de socket para obtener más información). Tenga en cuenta también que no se publica un evento de red de FD_CLOSE después de llamar a Closesocket .
 

Este es un resumen del comportamiento de closesocket :

  • Si el miembro l_onoff de la estructura LINGER es cero (el valor predeterminado para un socket), closesocket devuelve inmediatamente y la conexión se cierra correctamente en segundo plano.
  • Si el miembro l_onoff de la estructura persistente se establece en distinto de cero y el miembro l_linger se establece en cero (sin tiempo de espera) se devuelve inmediatamente y la conexión se restablece o finaliza.
  • Si el miembro de l_onoff de la estructura persistente se establece en distinto de cero y el miembro l_linger se establece en un tiempo de espera distinto de cero: para un socket de bloqueo, closesocket se bloquea hasta que todos los datos se envían o expira el tiempo de espera.

    – Para un socket de no bloqueo, closesocket devuelve inmediatamente que indica un error.

Para obtener más información , consulte Cierre con gracia, Opciones de persistencia y Cierre de socket para obtener más información.

Nota Al emitir una llamada de Winsock de bloqueo como closesocket, Winsock puede que tenga que esperar un evento de red antes de que se pueda completar la llamada. Winsock realiza una espera alertable en esta situación, que se puede interrumpir mediante una llamada de procedimiento asincrónica (APC) programada en el mismo subproceso. La emisión de otra llamada winsock de bloqueo dentro de un APC que interrumpió una llamada de Winsock de bloqueo en curso en el mismo subproceso provocará un comportamiento indefinido y los clientes winsock nunca deben intentarlo.
 

Notas para sockets irDA

Tenga en cuenta lo siguiente:

  • El archivo de encabezado Af_irda.h debe incluirse explícitamente.
  • Se admiten las opciones de persistencia estándar.
  • Aunque IrDA no proporciona un cierre estable, IrDA aplazará el cierre hasta que se purguen las colas de recepción. Por lo tanto, una aplicación puede enviar datos e llamar inmediatamente a la función de socket y estar seguro de que el receptor copiará los datos antes de recibir un mensaje de FD_CLOSE.

Notas para ATM

A continuación se muestran problemas importantes asociados con la desmontaje de conexión al usar el modo de transferencia asincrónica (ATM) y Windows Sockets 2:

  • El uso de las funciones closesocket o shutdown con SD_SEND o SD_BOTH da lugar a que se envíe una señal RELEASE en el canal de control. Debido al uso de canales de datos y señal independientes de ATM, es posible que una señal RELEASE llegue al extremo remoto antes de que el último de los datos llegue a su destino, lo que da lugar a una pérdida de esos datos. Una posible solución es programar un retraso suficiente entre los últimos datos enviados y las llamadas de función closesocket o shutdown para un socket ATM.
  • La mitad de cierre no es compatible con ATM.
  • Las desconexiones abortivas y elegantes dan lugar a que se envíe una señal RELEASE con el mismo campo de causa. En cualquier caso, los datos recibidos al final remoto del socket se siguen entregando a la aplicación. Consulte Cierre correcto, Opciones de persistencia y Cierre de socket para obtener más información.

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.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado winsock.h (incluya Winsock2.h)
Library Ws2_32.lib
Archivo DLL Ws2_32.dll

Consulte también

Cierre correcto, opciones persistentes y cierre de socket

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Funciones winsock

Referencia de Winsock

accept

getsockopt

ioctlsocket

Quedarse

setsockopt

socket