Écouteurs, connecteurs et points de terminaison NDKPI

Un consommateur NDK connecte un connecteur NDK en appelant la fonction NdkConnect (NDK_FN_CONNECT) ou NdkConnectWithSharedEndpoint (NDK_FN_CONNECT_WITH_SHARED_ENDPOINT).

Chaque connecteur à l’état connecté a également un point de terminaison sous-jacent qui représente la fin locale de la connexion NDK établie :

  • Un connecteur établi en acceptant une connexion entrante sur un écouteur NDK hérite automatiquement du point de terminaison implicite de l’écouteur en tant que point de terminaison implicite local.
  • Un connecteur connecté via la fonction NdkConnect a son propre point de terminaison local implicite dédié.
  • Un connecteur connecté via la fonction NdkConnectWithSharedEndpoint a un point de terminaison local explicite qui peut être partagé avec d’autres connecteurs qui sont également connectés via la fonction NdkConnectWithSharedEndpoint .

Le fournisseur NDK doit conserver une sorte de nombre de références pour chaque point de terminaison implicite ou explicite, et libérer le point de terminaison (c’est-à-dire marquer l’adresse/le port comme disponible pour être réutilisé) lorsque le nombre de références atteint zéro :

Comptage de références pour les points de terminaison (non partagés)

Lorsque le consommateur appelle la fonction NdkListen (NDK_FN_LISTEN), le fournisseur crée un point de terminaison implicite. Pour ce point de terminaison implicite, le fournisseur doit conserver un nombre de références comme suit :

  • Ajoutez une référence pour l’écouteur lui-même au nombre de références du point de terminaison.

  • Ajoutez une référence pour chaque connecteur accepté sur cet écouteur.

  • Supprimez une référence lorsqu’un connecteur précédemment accepté sur l’écouteur est fermé.

  • Supprimez une référence lorsque l’écouteur lui-même est fermé. Note Vous ne pouvez pas fermer l’écouteur tant que tous les connecteurs n’ont pas été fermés.

  • Relâchez le point de terminaison lorsque son nombre de références revient à zéro. (Ce n’est le cas que lorsque l’écouteur et tous les connecteurs acceptés sur l’écouteur ont été fermés.)

  • La simple fermeture de l’écouteur ne libère pas le point de terminaison tant que des connecteurs précédemment acceptés ne sont pas encore fermés. Cela signifie que les nouvelles demandes NdkListen, NdkConnect et NdkConnectWithSharedEndpoint pour la même adresse locale et le même port échouent jusqu’à ce que toutes ces connexions soient fermées. Notez que la demande de fermeture sur l’écouteur reste également en attente jusqu’à ce que toutes ces connexions soient fermées (en raison des règles antérieures/successeurs décrites dans exigences de durée de vie des objets NDKPI). Le fournisseur doit rejeter d’autres connexions entrantes sur l’écouteur dès qu’une demande de fermeture est émise (afin qu’aucune nouvelle connexion ne soit acceptée pendant que la demande de fermeture est en attente).

Comptage des références pour les connecteurs

Lorsque le consommateur appelle NdkConnect, le fournisseur crée un point de terminaison implicite. Pour ce point de terminaison implicite, le fournisseur doit :

  • Ajoutez une référence par le connecteur. Il n’existe qu’un seul connecteur, donc une seule référence.
  • Supprimez la référence du connecteur au point de terminaison lorsque le connecteur est fermé.
  • Relâchez le point de terminaison lorsque cette référence a disparu.

Comptage de références pour les points de terminaison partagés

Lorsque le consommateur appelle NdkConnectWithSharedEndpoint, le fournisseur crée un point de terminaison partagé explicite. Pour ce point de terminaison partagé explicite, le fournisseur doit :

  • Ajoutez une référence pour le point de terminaison partagé lui-même au nombre de références du point de terminaison partagé.
  • Ajoutez une référence pour chaque connecteur connecté sur ce point de terminaison partagé.
  • Supprimez une référence lorsqu’un connecteur précédemment connecté sur le point de terminaison partagé est fermé.
  • Relâchez le point de terminaison que le nombre de références retourne à zéro. (C’est le cas lorsque le point de terminaison partagé et tous les connecteurs connectés sur le point de terminaison partagé ont été fermés.)
  • La simple fermeture du point de terminaison partagé ne libère pas le point de terminaison tant qu’il existe des connecteurs précédemment connectés qui ne sont pas encore fermés. Cela signifie que les nouvelles demandes NdkListen, NdkConnect et NdkConnectWithSharedEndpoint pour la même adresse locale et le même port échouent jusqu’à ce que toutes ces connexions soient fermées. Notez que la demande de fermeture sur le point de terminaison partagé reste également en attente jusqu’à ce que toutes ces connexions soient fermées (en raison des règles antérieures/successeurs décrites dans exigences de durée de vie des objets NDKPI).

Network Direct Kernel Provider Interface (NDKPI)