Ouvintes, conectores e pontos de extremidade do NDKPI

Um consumidor NDK conecta um conector NDK chamando a função NdkConnect (NDK_FN_CONNECT) ou NdkConnectWithSharedEndpoint (NDK_FN_CONNECT_WITH_SHARED_ENDPOINT).

Cada conector que está em um estado conectado também tem um ponto de extremidade subjacente que representa o final local da conexão NDK estabelecida:

  • Um conector estabelecido aceitando uma conexão de entrada em um ouvinte NDK herda automaticamente o ponto de extremidade implícito do ouvinte como seu ponto de extremidade implícito local.
  • Um conector conectado por meio da função NdkConnect tem seu próprio ponto de extremidade local implícito dedicado.
  • Um conector conectado por meio da função NdkConnectWithSharedEndpoint tem um ponto de extremidade local explícito que pode ser compartilhado com outros conectores que também estão conectados por meio da função NdkConnectWithSharedEndpoint .

O provedor NDK deve manter algum tipo de contagem de referência para cada ponto de extremidade implícito ou explícito e liberar o ponto de extremidade (ou seja, marcar o endereço/porta como disponível para ser usado novamente) quando a contagem de referência atingir zero:

Contagem de referência para pontos de extremidade (não compartilhados)

Quando o consumidor chama a função NdkListen (NDK_FN_LISTEN), o provedor cria um ponto de extremidade implícito. Para esse ponto de extremidade implícito, o provedor deve manter uma contagem de referência da seguinte maneira:

  • Adicione uma referência para o próprio ouvinte à contagem de referência do ponto de extremidade.

  • Adicione uma referência para cada conector aceito por esse ouvinte.

  • Remova uma referência quando um conector que foi aceito anteriormente pelo ouvinte for fechado.

  • Remova uma referência quando o próprio ouvinte estiver fechado. Nota Não é possível fechar o ouvinte até que todos os conectores sejam fechados.

  • Solte o ponto de extremidade quando sua contagem de referência retornar a zero. (Esse é o caso somente quando o ouvinte e todos os conectores aceitos pelo ouvinte foram fechados.)

  • Simplesmente fechar o ouvinte não libera o ponto de extremidade, desde que haja conectores aceitos anteriormente que ainda não estejam fechados. Isso significa que as novas solicitações NdkListen, NdkConnect e NdkConnectWithSharedEndpoint para o mesmo endereço local e porta falharão até que todas essas conexões sejam fechadas. Observe que a solicitação próxima no ouvinte também permanecerá pendente até que todas essas conexões sejam fechadas (devido às regras antecedentes/sucessoras descritas nos Requisitos de Tempo de Vida do Objeto NDKPI). O provedor deve rejeitar novas conexões de entrada no ouvinte assim que uma solicitação próxima for emitida (para que nenhuma nova conexão seja aceita enquanto a solicitação de fechamento estiver pendente).

Contagem de referência para conectores

Quando o consumidor chama NdkConnect, o provedor cria um ponto de extremidade implícito. Para esse ponto de extremidade implícito, o provedor deve:

  • Adicione uma referência pelo conector. Há apenas um conector, portanto, apenas uma referência.
  • Remova a referência do conector ao ponto de extremidade quando o conector for fechado.
  • Solte o ponto de extremidade quando essa referência tiver sumido.

Contagem de referência para pontos de extremidade compartilhados

Quando o consumidor chama NdkConnectWithSharedEndpoint, o provedor cria um ponto de extremidade compartilhado explícito. Para esse ponto de extremidade compartilhado explícito, o provedor deve:

  • Adicione uma referência para o ponto de extremidade compartilhado em si à contagem de referência do ponto de extremidade compartilhado.
  • Adicione uma referência para cada conector conectado por esse ponto de extremidade compartilhado.
  • Remova uma referência quando um conector que foi conectado anteriormente pelo ponto de extremidade compartilhado for fechado.
  • Libere o ponto de extremidade que a contagem de referência retorna para zero. (Esse é o caso quando o ponto de extremidade compartilhado e todos os conectores conectados pelo ponto de extremidade compartilhado foram fechados.)
  • Simplesmente fechar o ponto de extremidade compartilhado não libera o ponto de extremidade, desde que haja conectores conectados anteriormente que ainda não estejam fechados. Isso significa que as novas solicitações NdkListen, NdkConnect e NdkConnectWithSharedEndpoint para o mesmo endereço local e porta falharão até que todas essas conexões sejam fechadas. Observe que a solicitação de fechamento no ponto de extremidade compartilhado também permanecerá pendente até que todas essas conexões sejam fechadas (devido às regras antecedentes/sucessoras descritas nos Requisitos de Tempo de Vida do Objeto NDKPI).

NDKPI (Network Direct Kernel Provider Interface)