Share via


Fonction de rappel LPWSPCLOSESOCKET (ws2spi.h)

La fonction LPWSPCloseSocket ferme un socket.

Syntaxe

LPWSPCLOSESOCKET Lpwspclosesocket;

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

Paramètres

[in] s

Descripteur identifiant un socket.

[out] lpErrno

Pointeur vers le code d’erreur.

Valeur retournée

Si aucune erreur ne se produit, LPWSPCloseSocket retourne zéro. Sinon, une valeur de SOCKET_ERROR est retournée et un code d’erreur spécifique est disponible dans lpErrno.

Code d'erreur Signification
WSAENETDOWN
Le sous-système réseau a échoué.
WSAEINPROGRESS
L’appel de sockets Windows est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAENOTSOCK
Le descripteur n’est pas un socket.
WSAEWOULDBLOCK
Socket est marqué comme non bloquant et SO_LINGER est défini sur une valeur de délai d’attente différente de zéro.

Remarques

Cette fonction ferme un socket. Plus précisément, il libère le descripteur de socket s. Par conséquent, d’autres références à s doivent échouer avec l’erreur WSAENOTSOCK. S’il s’agit de la dernière référence à un socket sous-jacent, les informations de nommage associées et les données en file d’attente sont ignorées. Tous les appels bloquants ou asynchrones en attente sur le socket (émis par n’importe quel thread de ce processus) sont annulés sans publier de messages de notification. Toutes les opérations en attente qui se chevauchent émises par n’importe quel thread de ce processus sont également annulées. L’action d’achèvement spécifiée pour ces opérations qui se chevauchent est effectuée (par exemple, événement, routine d’achèvement ou port d’achèvement). Dans ce cas, les opérations en attente qui se chevauchent échouent avec l’erreur status WSA_OPERATION_ABORTED . FD_CLOSE ne sera pas publié après l’appel de LPWSPCloseSocket .

Le comportement de LPWSPCloseSocket est résumé comme suit :

  • Si SO_DONTLINGER est activé (paramètre par défaut), LPWSPCloseSocket retourne immédiatement et la connexion est correctement fermée en arrière-plan.

  • Si SO_LINGER est activé avec un délai d’expiration zéro, LPWSPCloseSocket retourne immédiatement et la connexion est réinitialisée/terminée.

    ou

  • Si SO_LINGER est activé avec un délai d’expiration différent de zéro avec un socket bloquant, LPWSPCloseSocket se bloque jusqu’à ce que toutes les données soient envoyées ou que le délai d’expiration expire.

  • Si SO_LINGER est activé avec un délai d’attente différent de zéro avec un socket non bloquant, LPWSPCloseSocket retourne immédiatement, indiquant ainsi un échec.

La sémantique de LPWSPCloseSocket est affectée par les options de socket SO_LINGER et SO_DONTLINGER comme suit.

Option Intervalle Type de fermeture Attendre la fermeture ?
SO_DONTLINGER S’en ficher Sans perte de données No
SO_LINGER Zéro Difficile No
SO_LINGER Non nul Sans perte de données Yes

 

 

Si SO_LINGER est défini (autrement dit, le membre l_onoff de la structure persistante n’est pas nul) et que l’intervalle de délai d’attente, l_linger, est égal à zéro, LPWSPCloseSocket n’est pas bloqué même si les données en file d’attente n’ont pas encore été envoyées ou acceptées. C’est ce qu’on appelle une fermeture matérielle ou avortée, car le circuit virtuel du socket est réinitialisé immédiatement et toutes les données non ensentrées sont perdues. Tout appel LPWSPRecv du côté distant du circuit échoue avec WSAECONNRESET.

Si SO_LINGER est défini avec un intervalle de délai d’attente différent de zéro sur un socket bloquant, l’appel LPWSPCloseSocket se bloque sur un socket bloquant jusqu’à ce que les données restantes soient envoyées ou jusqu’à l’expiration du délai d’expiration. C’est ce qu’on appelle une déconnexion normale. Si le délai d’expiration expire avant l’envoi de toutes les données, le fournisseur de services doit arrêter la connexion avant le retour de LPWSPCloseSocket .

L’activation de SO_LINGER avec un intervalle de délai d’attente différent de zéro sur un socket non bloquant n’est pas recommandée. Dans ce cas, l’appel à LPWSPCloseSocket échoue avec une erreur WSAEWOULDBLOCK si l’opération de fermeture ne peut pas être effectuée immédiatement. Si LPWSPCloseSocket échoue avec WSAEWOULDBLOCK, le handle de socket est toujours valide et une déconnexion n’est pas lancée.

Le client Winsock SPI doit à nouveau appeler LPWSPCloseSocket pour fermer le socket, bien que LPWSPCloseSocket puisse continuer à échouer, sauf si le client Winsock SPI effectue l’une des opérations suivantes :

  • Désactive SO_DONTLINGER.
  • Active SO_LINGER avec un délai d’attente zéro.
  • Appelle LPWSPShutdown pour lancer la fermeture.

Si SO_DONTLINGER est défini sur un socket de flux (autrement dit, le membre l_onoff de la structure persistante est zéro), l’appel LPWSPCloseSocket retourne immédiatement et n’obtient pas WSAEWOULDBLOCK, que le socket soit bloquant ou non bloquant. Toutefois, toutes les données mises en file d’attente pour la transmission seront envoyées si possible avant la fermeture du socket sous-jacent. C’est ce qu’on appelle une déconnexion avec grâce et c’est le comportement par défaut.

Notez que dans ce cas, le fournisseur Winsock est autorisé à conserver toutes les ressources associées au socket jusqu’à ce que la déconnexion normale soit terminée ou que le fournisseur arrête la connexion en raison d’une incapacité à effectuer l’opération dans un laps de temps déterminé par le fournisseur. Cela peut affecter les clients Winsock qui s’attendent à utiliser tous les sockets disponibles. Il s’agit du comportement par défaut ; SO_DONTLINGER est défini par défaut.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
En-tête ws2spi.h

Voir aussi

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket