Partager via


PFN_WSK_ACCEPT fonction de rappel (wsk.h)

La fonction WskAccept accepte une connexion entrante sur un socket d’écoute.

Syntaxe

PFN_WSK_ACCEPT PfnWskAccept;

NTSTATUS PfnWskAccept(
  [in]            PWSK_SOCKET ListenSocket,
                  ULONG Flags,
  [in, optional]  PVOID AcceptSocketContext,
  [in, optional]  const WSK_CLIENT_CONNECTION_DISPATCH *AcceptSocketDispatch,
  [out, optional] PSOCKADDR LocalAddress,
  [out, optional] PSOCKADDR RemoteAddress,
  [in, out]       PIRP Irp
)
{...}

Paramètres

[in] ListenSocket

Pointeur vers une structure WSK_SOCKET qui spécifie l’objet socket pour le socket d’écoute ou de flux vérifié pour une connexion entrante.

Flags

Ce paramètre est réservé à l’utilisation du système. Une application WSK doit définir ce paramètre sur zéro.

[in, optional] AcceptSocketContext

Pointeur vers un contexte fourni par l’appelant pour le socket accepté. Le sous-système WSK transmet ce pointeur aux fonctions de rappel d’événements du socket accepté. Les informations de contexte sont opaques pour le sous-système WSK. Les informations de contexte doivent être stockées en mémoire non paginée. Si l’application WSK n’active aucune fonction de rappel d’événement sur le socket accepté, elle doit définir ce pointeur sur NULL.

[in, optional] AcceptSocketDispatch

Pointeur vers une constante structure WSK_CLIENT_CONNECTION_DISPATCH. Cette structure est une table de répartition qui contient des pointeurs vers les fonctions de rappel d’événement pour le socket accepté. Si l’application WSK n’active pas toutes les fonctions de rappel d’événement pour le socket accepté, elle doit définir les pointeurs de la table de distribution sur null pour ces fonctions de rappel d’événements qu’elle n’active pas. Si l’application WSK n’active aucune fonction de rappel d’événement sur le socket accepté, elle doit définir ce pointeur sur NULL.

[out, optional] LocalAddress

Pointeur vers une mémoire tampon allouée par l’appelant qui reçoit l’adresse de transport locale sur laquelle la connexion entrante est arrivée. La mémoire tampon doit se trouver en mémoire non paginée. La mémoire tampon doit également être suffisamment grande pour contenir le type de structure SOCKADDR spécifique qui correspond à la famille d’adresses spécifiée par l’application WSK spécifiée lors de la création du socket d’écoute. Ce pointeur est facultatif et peut être NULL.

[out, optional] RemoteAddress

Pointeur vers une mémoire tampon allouée par l’appelant qui reçoit l’adresse de transport distante à partir de laquelle la connexion entrante provient. La mémoire tampon doit se trouver en mémoire non paginée. La mémoire tampon doit également être suffisamment grande pour contenir le type de structure SOCKADDR spécifique qui correspond à la famille d’adresses spécifiée par l’application WSK spécifiée lors de la création du socket d’écoute. Ce pointeur est facultatif et peut être NULL.

[in, out] Irp

Pointeur vers un IRP alloué par l’appelant que le sous-système WSK utilise pour terminer l’opération d’acceptation de manière asynchrone. Pour plus d’informations sur l’utilisation d’IRPs avec des fonctions WSK, consultez Utilisation d’IRPs avec winsock Kernel Functions.

Valeur de retour

WskAccept retourne l’un des codes NTSTATUS suivants :

Retourner le code Description
STATUS_SUCCESS
Une connexion entrante a été acceptée avec succès. L’IRP sera terminé avec l’état de réussite.
STATUS_PENDING
L’IRP a été mis en file d’attente par le sous-système WSK, qui attend une connexion entrante sur le socket d’écoute.
STATUS_FILE_FORCED_CLOSED
Le socket n’est plus fonctionnel. L’IRP est terminé avec l’état d’échec. L’application WSK doit appeler la fonction WskCloseSocket pour fermer le socket dès que possible.
Autres codes d’état
Une erreur s’est produite. L’IRP est terminé avec l’état d’échec.

Remarques

Une application WSK peut appeler la fonction WskAccept sur un socket d’écoute ou un socket de flux qu’elle avait précédemment liée à une adresse de transport locale en appelant la fonction WskBind.

Le comportement de la fonction WskAccept dépend de l’acceptation d’une connexion entrante sur le socket d’écoute :

  • Si une connexion entrante est déjà arrivée sur le socket d’écoute et attend d’être acceptée, la fonction WskAccept retourne STATUS_SUCCESS. Dans ce cas, l’IRP est terminé avec l’état de réussite et le champ IoStatus.Information de l’IRP contient un pointeur vers l’objet socket pour le socket accepté.
  • Si une connexion entrante n’attend pas d’être acceptée sur le socket d’écoute, WskAccept retourne STATUS_PENDING et le sous-système WSK met en file d’attente l’IRP jusqu’à ce qu’une connexion entrante soit reçue. Lorsqu’une connexion entrante est reçue, le sous-système WSK termine de façon asynchrone l’IRP avec l’état de réussite. Dans ce cas, le champ IoStatus.Information du protocole IRP contient un pointeur vers l’objet socket pour le socket accepté.
Si la fonction de rappel d’événement WskAcceptEvent d’une application WSK est activée sur un socket d’écoute et que l’application a un appel en attente à la fonction WskAccept sur le même socket d’écoute, lorsqu’une connexion entrante arrive, l’appel en attente à WskAccept est prioritaire sur la fonction de rappel d’événement WskAcceptEvent. Le sous-système WSK appelle la fonction de rappel d’événements WskAcceptEvent de l’application uniquement s’il n’y a pas d’IRPs mis en file d’attente à partir d’appels en attente vers WskAccept. Toutefois, une application WSK ne doit pas supposer que le sous-système WSK n’appelle pas la fonction de rappel d’événement WskAcceptEvent de l’application pour un socket d’écoute qui a un appel en attente à la fonction WskAccept. Les conditions de concurrence existent où le sous-système WSK peut toujours appeler la fonction de rappel d’événement WSK WskAcceptEvent pour le socket. La seule façon pour une application WSK de s’assurer que le sous-système WSK n’appelle pas la fonction de rappel d’événement WskAcceptEvent de l’application pour un socket d’écoute consiste à désactiver la fonction de rappel d 'événement WskAcceptEvent de l’application sur le socket.

Lorsque la fonction WskAccept accepte correctement une connexion entrante, toutes les fonctions de rappel d’événement sur le socket accepté sont désactivées par défaut. Pour plus d’informations sur l’activation de l’une des fonctions de rappel d’événements du socket accepté, consultez Fonctions d’activation et de désactivation des fonctions de rappel d’événements.

Si une application WSK spécifie un pointeurNULL non dans le paramètre LocalAddress, dans le paramètre RemoteAddress, ou dans les deux paramètres, et si WskAccept retourne STATUS_PENDING, les mémoires tampons pointées par ces paramètres doivent rester valides jusqu’à ce que l’IRP soit terminé. Si l’application WSK a alloué les mémoires tampons avec l’une des fonctions ExAllocateXxx, elle ne peut pas libérer la mémoire avec la fonction ExFreeXxx correspondante jusqu’à la fin de l’IRP. Si l’application WSK a alloué les mémoires tampons sur la pile, elle ne peut pas revenir de la fonction qui appelle la fonction WskAccept jusqu’à la fin de l’IRP.

Le sous-système WSK alloue la mémoire de la structure d’objets de socket (WSK_SOCKET) pour la connexion acceptée pour le compte de l’application WSK. Le sous-système WSK libère cette mémoire lorsque le socket est fermé.

Exigences

Exigence Valeur
client minimum pris en charge Disponible dans Windows Vista et versions ultérieures des systèmes d’exploitation Windows.
plateforme cible Universel
d’en-tête wsk.h (include Wsk.h)
IRQL <= DISPATCH_LEVEL

Voir aussi

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_PROVIDER_LISTEN_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskAcceptEvent

WskBind

WskCloseSocket

WskSocket