LPFN_DISCONNECTEX función de devolución de llamada (mswsock.h)

La función DisconnectEx cierra una conexión en un socket y permite reutilizar el identificador de socket.

Nota

Esta función es una extensión específica de Microsoft para la especificación de Windows Sockets.

Sintaxis

LPFN_DISCONNECTEX LpfnDisconnectex;

BOOL LpfnDisconnectex(
  SOCKET s,
  LPOVERLAPPED lpOverlapped,
  DWORD dwFlags,
  DWORD dwReserved
)
{...}

Parámetros

s

Identificador de un socket conectado orientado a la conexión.

lpOverlapped

Puntero a una estructura OVERLAPPED. Si el identificador de socket se ha abierto como superpuesto, especificar este parámetro da como resultado una operación de E/S superpuesta (asincrónica).

dwFlags

Conjunto de marcas que personaliza el procesamiento de la llamada de función. Cuando este parámetro se establece en cero, no se establece ninguna marca. El parámetro dwFlags puede tener el siguiente valor.

Marca Significado
TF_REUSE_SOCKET Prepara el identificador de socket que se va a reutilizar. Cuando se completa la solicitud DisconnectEx , el identificador de socket se puede pasar a la función AcceptEx o ConnectEx .
Nota: La desconexión de nivel de socket está sujeta al comportamiento del transporte subyacente. Por ejemplo, un socket TCP puede estar sujeto al estado tcp TIME_WAIT, lo que provoca que la llamada DisconnectEx se retrase.

dwReserved

Reservado. Debe ser cero. Si no es cero, se devuelve WSAEINVAL .

Valor devuelto

Si se ejecuta correctamente, la función DisconnectEx devuelve TRUE. En caso de error, la función devuelve FALSE. Use la función WSAGetLastError para obtener información de error extendida. Si una llamada a la función WSAGetLastError devuelve ERROR_IO_PENDING, la operación se inició correctamente y está en curso. En tales circunstancias, la llamada puede seguir produciendo un error cuando se completa la operación.

Código de error Descripción
WSAEFAULT El sistema detectó una dirección de puntero no válida al intentar usar un argumento de puntero. Este error se devuelve si se pasó un valor de puntero no válido en el parámetro lpOverlapped .
WSAEINVAL Se pasó el parámetro no válido. Este error se devuelve si el parámetro dwFlags se especificó con un valor cero distinto de TF_REUSE_SOCKET.
WSAENOTCONN El socket no está conectado. Este error se devuelve si el parámetro del socket s no estaba en un estado conectado. Este error también se puede devolver si el socket estaba en estado de cierre de transmisión de una solicitud anterior y el parámetro dwFlags no se estableció en TF_REUSE_SOCKET para solicitar una reutilización del socket.

Comentarios

La función DisconnectEx no admite sockets de datagramas. Por lo tanto, el socket especificado por hSocket debe estar orientado a la conexión, como un socket de SOCK_STREAM, SOCK_SEQPACKET o SOCK_RDM.

Nota

El puntero de función para la función DisconnectEx debe obtenerse en tiempo de ejecución realizando una llamada a la función WSAIoctl con el SIO_GET_EXTENSION_FUNCTION_POINTER código de operación especificado. El búfer de entrada pasado a la función WSAIoctl debe contener WSAID_DISCONNECTEX, un identificador único global (GUID) cuyo valor identifica la función de extensión DisconnectEx . Si se ejecuta correctamente, la salida devuelta por la función WSAIoctl contiene un puntero a la función DisconnectEx . El GUID de WSAID_DISCONNECTEX se define en el archivo de encabezado Mswsock.h .

Cuando lpOverlapped no es NULL, es posible que la E/S superpuesta no finalice antes de que Se devuelva DisconnectEx , lo que hace que la función DisconnectEx devuelva FALSE y una llamada a la función WSAGetLastError que devuelve ERROR_IO_PENDING. Este diseño permite al autor de la llamada continuar procesando mientras se completa la operación de desconexión. Tras la finalización de la solicitud, Windows establece el evento especificado por el miembro hEvent de la estructura SUPERPUESTA , o el socket especificado por hSocket, en el estado señalado.

Nota

Todas las E/S iniciadas por un subproceso determinado se cancelan cuando se cierra ese subproceso. En el caso de los sockets superpuestos, las operaciones asincrónicas pendientes pueden producir un error si el subproceso está cerrado antes de que se completen las operaciones. Consulte ExitThread para obtener más información.

El estado TIME_WAIT determina el tiempo que debe transcurrir antes de que TCP pueda liberar una conexión cerrada y reutilizar sus recursos. Este intervalo entre el cierre y la versión se conoce como estado de TIME_WAIT o 2MSL. Durante este tiempo, la conexión se puede volver a abrir a un costo mucho menor para el cliente y el servidor que establecer una nueva conexión. El comportamiento de TIME_WAIT se especifica en RFC 793 , que requiere que TCP mantenga una conexión cerrada durante un intervalo al menos igual al doble de la duración máxima del segmento (MSL) de la red. Cuando se libera una conexión, su par de sockets y los recursos internos usados para el socket se pueden usar para admitir otra conexión.

Windows TCP revierte a un estado TIME_WAIT posterior al cierre de una conexión. Mientras se encuentra en el estado TIME_WAIT, no se puede volver a usar un par de sockets. El período de TIME_WAIT se puede configurar modificando la siguiente configuración del Registro DWORD que representa el período de TIME_WAIT en segundos.

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Servicios\TCPIP\Parámetros\TcpTimedWaitDelay

De forma predeterminada, el MSL se define como 120 segundos. El valor predeterminado del Registro TcpTimedWaitDelay es un valor de 240 segundos, que representa 2 veces la duración máxima del segmento de 120 segundos o 4 minutos. Sin embargo, puede usar esta entrada para personalizar el intervalo. Reducir el valor de esta entrada permite que TCP libere las conexiones cerradas con mayor rapidez, lo que proporciona más recursos para las nuevas conexiones. Sin embargo, si el valor es demasiado bajo, TCP podría liberar los recursos de conexión antes de que se complete la conexión, lo que requiere que el servidor use recursos adicionales para volver a establecer la conexión. Esta configuración del Registro se puede establecer de 0 a 300 segundos.

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 Valor
Header mswsock.h