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

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

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

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

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

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

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

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

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

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

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

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

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

连接器的引用计数

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

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

共享终结点的引用计数

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

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

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