Share via


Fonction de rappel LPWSPCANCELBLOCKINGCALL (ws2spi.h)

La fonction LPWSPCancelBlockingCall annule un appel bloquant en cours.

Syntaxe

LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;

int Lpwspcancelblockingcall(
  [out] LPINT lpErrno
)
{...}

Paramètres

[out] lpErrno

Pointeur vers le code d’erreur.

Valeur retournée

La valeur retournée par LPWSPCancelBlockingCall est égale à zéro si l’opération a été annulée avec succès. Sinon, la valeur 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é.
WSAEINVAL
Indique qu’aucun appel bloquant n’est en attente.

Remarques

Cette fonction annule toute opération de blocage en attente pour ce thread. Il est généralement utilisé dans deux situations :

  • Un client SPI Windows Sockets traite un message qui a été reçu pendant qu’un fournisseur de services implémente le pseudoblocage. Dans ce cas, WSAIsBlocking aura la valeur true.
  • Un appel bloquant est en cours et le fournisseur de services Winsock a rappelé la fonction de raccordement bloquant du client Winsock SPI (via la fonction de rappel récupérée à partir de WPUQueryBlockingCallback), qui à son tour appelle cette fonction. Une telle situation peut se produire, par instance, lors de l’implémentation d’une option Annuler pour une opération qui nécessite un délai d’exécution prolongé.

Dans chaque cas, l’appel bloquant d’origine se termine dès que possible avec l’erreur WSAEINTR. (Dans la première instance l’arrêt n’aura pas lieu tant que la planification des messages Windows n’aura pas provoqué le retour du contrôle à la routine pseudo-blocage dans Winsock. Dans la deuxième instance, l’appel bloquant est arrêté dès que la fonction de hook de blocage est terminée.)

Dans le cas d’une opération LPWSPConnect bloquante, Winsock met fin à l’appel de blocage dès que possible, mais il ne peut pas être possible que les ressources de socket soient libérées tant que la connexion n’est pas terminée (puis réinitialisée) ou que le délai d’attente n’est pas dépassé. Cela n’est probablement visible que si le client SPI Winsock tente immédiatement d’ouvrir un nouveau socket (si aucun socket n’est disponible) ou de se connecter au même homologue via un appel LPWSPConnect .

L’annulation d’un appel LPWSPAccept ou LPWSPSelect n’a pas d’impact négatif sur les sockets passés à ces appels. Seul l’appel particulier échoue ; toute opération qui était légale avant l’annulation est légale après l’annulation, et l’état du socket n’est pas affecté de quelque manière que ce soit.

L’annulation de toute opération autre que LPWSPAccept et LPWSPSelect peut laisser le socket dans un état indéterminé. Si un client Winsock SPI annule une opération bloquante sur un socket, la seule opération que le client Winsock SPI peut effectuer sur le socket est un appel à LPWSPCloseSocket, bien que d’autres opérations puissent fonctionner sur certains fournisseurs de services Winsock. Si un client Winsock SPI nécessite une portabilité maximale, il doit veiller à ne pas dépendre de l’exécution d’opérations après une opération d’annulation. Un client Winsock SPI peut réinitialiser la connexion en définissant le délai d’attente sur SO_LINGER sur zéro et en appelant LPWSPCloseSocket.

Si une opération d’annulation a compromis l’intégrité du flux de données d’un SOCK_STREAM de quelque manière que ce soit, le fournisseur Winsock réinitialisera la connexion et échouera toutes les opérations futures autres que LPWSPCloseSocket avec WSAECONNABORTED.

Il est acceptable que LPWSPCancelBlockingCall retourne correctement si l’opération réseau bloquante se termine avant d’être annulée. Dans ce cas, l’opération de blocage retourne correctement comme si LPWSPCancelBlockingCall n’avait jamais été appelé. La seule façon pour le client Winsock SPI de confirmer qu’une opération a effectivement été annulée consiste à case activée pour un code de retour de WSAEINTR à partir de l’appel bloquant.

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

WPUQueryBlockingCallback

WSAIsBlocking

LPWSPAccept

LPWSPCloseSocket

LPWSPSelect

LPWSPSocket