Прослушиватели, соединители и конечные точки NDKPI

Потребитель NDK подключает соединитель NDK, вызывая функцию NdkConnect (NDK_FN_CONNECT) или NdkConnectWithSharedEndpoint (NDK_FN_CONNECT_WITH_SHARED_ENDPOINT).

Каждый соединитель, который находится в подключенном состоянии, также имеет базовую конечную точку, представляющую локальный конец установленного подключения NDK:

  • Соединитель, установленный путем приема входящего подключения через прослушиватель NDK, автоматически наследует неявную конечную точку прослушивателя в качестве локальной неявной конечной точки.
  • Соединитель, подключенный через функцию NdkConnect , имеет собственную выделенную неявную локальную конечную точку.
  • Соединитель, подключенный через функцию NdkConnectWithSharedEndpoint , имеет явную локальную конечную точку, которую можно использовать совместно с другими соединителями, которые также подключены через функцию NdkConnectWithSharedEndpoint .

Поставщик NDK должен сохранить определенное число ссылок для каждой неявной или явной конечной точки и освободить конечную точку (т. е. пометить адрес или порт как доступный для использования), когда число ссылок достигнет нуля:

Подсчет ссылок для конечных точек (без общего доступа)

Когда потребитель вызывает функцию NdkListen (NDK_FN_LISTEN), поставщик создает неявную конечную точку. Для этой неявной конечной точки поставщик должен поддерживать счетчик ссылок следующим образом:

  • Добавьте ссылку на сам прослушиватель в число ссылок конечной точки.

  • Добавьте ссылку на каждый соединитель, который принимается через этот прослушиватель.

  • Удалите ссылку при закрытии соединителя, который ранее был принят через прослушиватель.

  • Удаление ссылки при закрытии самого прослушивателя. Примечание Вы не сможете закрыть прослушиватель, пока не будут закрыты все соединители.

  • Отпустите конечную точку, когда количество ссылок возвращается к нулю. (Это происходит только в том случае, если прослушиватель и все соединители, принятые через прослушиватель, были закрыты.)

  • Простое закрытие прослушивателя не освобождает конечную точку, если есть ранее принятые соединители, которые еще не закрыты. Это означает, что новые запросы NdkListen, NdkConnect и NdkConnectWithSharedEndpoint для одного локального адреса и порта будут завершаться ошибкой, пока все такие подключения не будут закрыты. Обратите внимание, что запрос на закрытие прослушивателя также будет оставаться в ожидании до тех пор, пока все такие подключения не будут закрыты (из-за правил предшествующей или последующей обработки, описанных в требованиях к времени существования объектов NDKPI). Поставщик должен отклонить дальнейшие входящие подключения к прослушивателю сразу после отправки запроса на закрытие (чтобы новые подключения не принимались, пока запрос на закрытие находится в ожидании).

Подсчет ссылок для соединителей

Когда потребитель вызывает NdkConnect, поставщик создает и неявную конечную точку. Для этой неявной конечной точки поставщик должен:

  • Добавьте ссылку с помощью соединителя. Существует только один соединитель, следовательно, только одна ссылка.
  • Удалите ссылку соединителя на конечную точку при закрытии соединителя.
  • Отпустите конечную точку, когда эта ссылка будет удалена.

Подсчет ссылок для общих конечных точек

Когда потребитель вызывает NdkConnectWithSharedEndpoint, поставщик создает явную общую конечную точку. Для этой явной общей конечной точки поставщик должен:

  • Добавьте ссылку на саму общую конечную точку в число ссылок общей конечной точки.
  • Добавьте ссылку на каждый соединитель, подключенный через общую конечную точку.
  • Удаление ссылки при закрытии соединителя, который ранее был подключен через общую конечную точку.
  • Отпустите конечную точку, чтобы счетчик ссылок вернулся к нулю. (Это происходит, когда общая конечная точка и все соединители, подключенные через общую конечную точку, были закрыты.)
  • Простое закрытие общей конечной точки не освобождает конечную точку, если есть ранее подключенные соединители, которые еще не закрыты. Это означает, что новые запросы NdkListen, NdkConnect и NdkConnectWithSharedEndpoint для одного локального адреса и порта будут завершаться ошибкой, пока все такие подключения не будут закрыты. Обратите внимание, что запрос на закрытие в общей конечной точке также будет оставаться в ожидании до тех пор, пока все такие подключения не будут закрыты (из-за правил предшествующей и последующей обработки, описанных в разделе Требования к времени существования объектов NDKPI).

Сетевой интерфейс поставщика ядра (NDKPI)