Share via


LPFN_DISCONNECTEX fonction de rappel (mswsock.h)

La fonction DisconnectEx ferme une connexion sur un socket et permet la réutilisation du handle de socket.

Notes

Cette fonction est une extension spécifique à Microsoft de la spécification des sockets Windows.

Syntaxe

LPFN_DISCONNECTEX LpfnDisconnectex;

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

Paramètres

s

Handle à un socket connecté orienté connexion.

lpOverlapped

Pointeur vers une structure OVERLAPPED. Si le handle de socket a été ouvert en tant que chevauchement, la spécification de ce paramètre entraîne une opération d’E/S (asynchrone) qui se chevauche.

dwFlags

Ensemble d’indicateurs qui personnalise le traitement de l’appel de fonction. Lorsque ce paramètre est défini sur zéro, aucun indicateur n’est défini. Le paramètre dwFlags peut avoir la valeur suivante.

Indicateur Signification
TF_REUSE_SOCKET Prépare le handle de socket à réutiliser. Une fois la requête DisconnectEx terminée, le handle de socket peut être passé à la fonction AcceptEx ou ConnectEx .
Note: La déconnexion au niveau du socket est soumise au comportement du transport sous-jacent. Par exemple, un socket TCP peut être soumis à l’état de TIME_WAIT TCP, ce qui entraîne le retard de l’appel DisconnectEx .

dwReserved

Réservé. Doit être zéro. Si elle n’est pas nulle, WSAEINVAL est retournée.

Valeur retournée

En cas de réussite, la fonction DisconnectEx retourne TRUE. En cas d’échec, la fonction retourne FALSE. Utilisez la fonction WSAGetLastError pour obtenir des informations d’erreur étendues. Si un appel à la fonction WSAGetLastError retourne ERROR_IO_PENDING, l’opération a démarré avec succès et est en cours. Dans de telles circonstances, l’appel peut toujours échouer une fois l’opération terminée.

Code d'erreur Description
WSAEFAULT Le système a détecté une adresse de pointeur non valide lors de la tentative d’utilisation d’un argument pointeur. Cette erreur est retournée si une valeur de pointeur non valide a été passée dans le paramètre lpOverlapped .
WSAEINVAL Le paramètre non valide a été passé. Cette erreur est retournée si le paramètre dwFlags a été spécifié avec une valeur zéro autre que TF_REUSE_SOCKET.
WSAENOTCONN Le socket n'est pas connecté. Cette erreur est retournée si le paramètre socket s n’était pas dans un état connecté. Cette erreur peut également être retournée si le socket était à l’état de fermeture de transmission à partir d’une demande précédente et que le paramètre dwFlags n’a pas été défini sur TF_REUSE_SOCKET pour demander une réutilisation du socket.

Remarques

La fonction DisconnectEx ne prend pas en charge les sockets de datagramme. Par conséquent, le socket spécifié par hSocket doit être orienté connexion, tel qu’un socket SOCK_STREAM, SOCK_SEQPACKET ou SOCK_RDM.

Notes

Le pointeur de fonction pour la fonction DisconnectEx doit être obtenu au moment de l’exécution en appelant la fonction WSAIoctl avec l’opcode SIO_GET_EXTENSION_FUNCTION_POINTER spécifié. La mémoire tampon d’entrée passée à la fonction WSAIoctl doit contenir WSAID_DISCONNECTEX, un identificateur global unique (GUID) dont la valeur identifie la fonction d’extension DisconnectEx . En cas de réussite, la sortie retournée par la fonction WSAIoctl contient un pointeur vers la fonction DisconnectEx . Le GUID WSAID_DISCONNECTEX est défini dans le fichier d’en-tête Mswsock.h .

Lorsque lpOverlapped n’a pas la valeur NULL, les E/S qui se chevauchent risquent de ne pas se terminer avant le retour de DisconnectEx, ce qui entraîne le retour de la fonction DisconnectEx false et un appel à la fonction WSAGetLastError renvoyant ERROR_IO_PENDING. Cette conception permet à l’appelant de continuer le traitement pendant que l’opération de déconnexion se termine. Une fois la demande terminée, Windows définit l’événement spécifié par le membre hEvent de la structure OVERLAPPED , ou le socket spécifié par hSocket, à l’état signalé.

Notes

Toutes les E/S initiées par un thread donné sont annulées à la sortie de ce thread. Pour les sockets qui se chevauchent, les opérations asynchrones en attente peuvent échouer si le thread est fermé avant la fin des opérations. Pour plus d’informations, consultez ExitThread .

L’état TIME_WAIT détermine le temps qui doit s’écouler avant que TCP puisse libérer une connexion fermée et réutiliser ses ressources. Cet intervalle entre la fermeture et la mise en production est appelé état TIME_WAIT ou état 2MSL. Pendant ce temps, la connexion peut être rouverte à un coût beaucoup moins élevé pour le client et le serveur que l’établissement d’une nouvelle connexion. Le comportement TIME_WAIT est spécifié dans la RFC 793 , qui exige que TCP conserve une connexion fermée pendant un intervalle au moins égal à deux fois la durée de vie maximale du segment (MSL) du réseau. Lorsqu’une connexion est libérée, sa paire de sockets et les ressources internes utilisées pour le socket peuvent être utilisées pour prendre en charge une autre connexion.

Windows TCP revient à un état TIME_WAIT après la fermeture d’une connexion. Lorsque l’état TIME_WAIT, une paire de sockets ne peut pas être réutilisée. La période TIME_WAIT est configurable en modifiant le paramètre de Registre DWORD suivant qui représente la période TIME_WAIT en secondes.

HKEY_LOCAL_MACHINE\Système\Currentcontrolset\Services\TCPIP\Paramètres\TcpTimedWaitDelay

Par défaut, le MSL est défini sur 120 secondes. Le paramètre de Registre TcpTimedWaitDelay est défini par défaut sur une valeur de 240 secondes, ce qui représente 2 fois la durée de vie maximale du segment de 120 secondes ou 4 minutes. Toutefois, vous pouvez utiliser cette entrée pour personnaliser l’intervalle. La réduction de la valeur de cette entrée permet à TCP de libérer des connexions fermées plus rapidement, en fournissant plus de ressources pour les nouvelles connexions. Toutefois, si la valeur est trop faible, TCP peut libérer des ressources de connexion avant la fin de la connexion, ce qui oblige le serveur à utiliser des ressources supplémentaires pour rétablir la connexion. Ce paramètre de Registre peut être défini de 0 à 300 secondes.

Windows Phone 8 : cette fonction est prise en charge pour les applications du Store Windows Phone Windows Phone 8 et versions ultérieures.

Windows 8.1 et Windows Server 2012 R2 : cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.

Configuration requise

Condition requise Valeur
En-tête mswsock.h