NDKPI 侦听器、连接器和终结点

NDK 使用者通过调用 NdkConnect (NDK_FN_CONNECT) 或 NdkConnectWithSharedEndpointNDK_FN_CONNECT_WITH_SHARED_ENDPOINT) 函数来连接 NDK 连接器。

处于连接状态的每个连接器也有一个基础终结点,该终结点表示已建立的 NDK 连接的本地端:

  • 通过接受通过 NDK 侦听器的传入连接建立的连接器会自动继承侦听器的隐式终结点作为其本地隐式终结点。
  • 通过 NdkConnect 函数连接的连接器有自己的专用隐式本地终结点。
  • 通过 NdkConnectWithSharedEndpoint 函数连接的连接器具有显式的本地终结点,该终结点可与通过 NdkConnectWithSharedEndpoint 函数连接的其他连接器共享。

当引用计数达到零时,NDK 提供程序必须为每个隐式或显式终结点保留某种类型的引用计数,并释放终结点(即,将地址/端口标记为可用于再次使用):

(非共享)终结点的引用计数

当使用者调用 NdkListenNDK_FN_LISTEN) 函数时,提供程序将创建一个隐式终结点。 对于此隐式终结点,提供程序必须维护引用计数,如下所示:

  • 将侦听器本身的引用添加到端点的引用计数中。

  • 为通过该侦听器接受的每个连接器添加引用。

  • 关闭以前通过侦听器接受的连接器时,请删除对该连接器的引用。

  • 关闭侦听器本身时删除引用。 注意 在关闭所有连接器之前,无法关闭侦听器。

  • 当终结点的引用计数返回零时释放该终结点。 (仅当侦听器和通过侦听器接受的所有连接器已关闭时,才会发生这种情况。

  • 仅仅关闭监听器不会释放终结点,因为以前接受的连接器尚未关闭。 这意味着,对同一本地地址和端口的新 NdkListenNdkConnectNdkConnectWithSharedEndpoint 请求将失败,直到所有此类连接关闭为止。 请注意,由于NDKPI 对象生存期要求中概述的先行/后续规则,在关闭所有此类连接之前,侦听器上的关闭请求将保持挂起状态。 发出关闭请求后,提供程序必须立即拒绝侦听器上的新的传入连接(以确保在关闭请求挂起时不会接受任何新连接)。

连接器的引用计数

当使用者调用 NdkConnect 时,提供程序将创建和隐式终结点。 对于此隐式终结点,提供程序必须:

  • 通过连接器添加引用。 只有一个连接器,因此只有一个引用。
  • 关闭连接器时,删除连接器对终结点的引用。
  • 当引用被移除时释放端点。

共享终结点的引用计数

当使用者调用 NdkConnectWithSharedEndpoint 时,提供程序将创建显式共享终结点。 对于此显式共享终结点,提供程序必须:

  • 将共享终结点本身的引用添加到共享终结点的引用计数。
  • 为通过该共享终结点连接的每个连接器添加引用。
  • 当以前通过共享终结点连接的连接器关闭时,删除引用。
  • 释放终结点,当引用计数返回到零时。 (当共享终结点和通过共享终结点连接的所有连接器已关闭时,会出现这种情况。
  • 只要以前连接的连接器尚未关闭,关闭共享终结点就不会释放终结点。 这意味着,对同一本地地址和端口的新 NdkListenNdkConnectNdkConnectWithSharedEndpoint 请求将失败,直到所有此类连接关闭为止。 请注意,共享终结点上的关闭请求将处于挂起状态,直到所有此类连接关闭(根据 NDKPI 对象生存期要求中概述的先行/后续规则)。

网络直接内核提供者接口 (NDKPI)