Especificando pontos de extremidade
Um ponto de extremidade é um endereço específico da rede de um processo de servidor para chamadas de procedimento remoto. O nome real do ponto de extremidade depende da sequência de protocolo usada. Por exemplo, portas de uso TCP, UDP e HTTP. Pipes nomeados usam um nome de pipe nomeado. Os aplicativos cliente/servidor podem usar um ponto de extremidade conhecido ou um ponto de extremidade dinâmico. Esta seção apresenta as técnicas que os programas de servidor usam para especificar pontos de extremidade conhecidos e dinâmicos. As informações são discutidas nos seguintes tópicos:
Especificando pontos de extremidade conhecidos
Quando o servidor usa um ponto de extremidade conhecido, ele pode incluir os dados do ponto de extremidade como parte de sua entrada de banco de dados de serviço de nome. Se isso acontecer, o identificador de associação do cliente contém um endereço de servidor completo que inclui o ponto de extremidade conhecido quando o cliente importa o identificador de associação da entrada do servidor.
Seu programa de servidor também pode especificar pontos de extremidade conhecidos ao mesmo tempo em que especifica sequências de protocolo. Invoque a função RpcServerUseProtseqEp ou RpcServerUseProtseqEpEx . A diferença entre os dois é que a última função tem um parâmetro extra que seu servidor pode usar para controlar a alocação de porta dinâmica.
Se o programa de servidor especificar suas informações de ponto de extremidade dessa maneira, ele também deverá chamar a função RpcEpRegister para registrar o ponto de extremidade no mapa do ponto de extremidade. Embora o ponto de extremidade seja sempre o mesmo, o cliente pode usar o mapa do ponto de extremidade para localizar o servidor.
Assim como as sequências de protocolo, um aplicativo pode especificar informações de ponto de extremidade em seu arquivo IDL. Quando isso acontecer, ele deverá registrar as sequências de protocolo e os pontos de extremidade ao mesmo tempo invocando a função RpcServerUseAllProtseqsIf ou RpcServerUseAllProtseqsIfEx . Nesse caso, o cliente tem acesso às informações do ponto de extremidade por meio da especificação da interface no arquivo IDL. Portanto, não é necessário chamar a função RpcEpRegister .
Especificando pontos de extremidade dinâmicos
Um ponto de extremidade dinâmico é um ponto de extremidade que o computador host do servidor atribui quando o servidor inicia a execução. A maioria dos aplicativos de servidor usa pontos de extremidade dinâmicos para evitar conflitos com outros programas sobre o número limitado de portas disponíveis no sistema de computador host do servidor. No entanto, os programas que usam pipes nomeados ou a sequência de protocolo ncalrpc têm um espaço de nome de ponto de extremidade muito grande. Eles se beneficiam menos de pontos de extremidade dinâmicos do que programas que usam outros transportes.
Os programas de servidor registram pontos de extremidade dinâmicos em um banco de dados de mapa de ponto de extremidade. Se você quiser que o servidor use qualquer ponto de extremidade disponível, chame RpcServerUseAllProtSeqs, RpcServerUseAllProtseqsEx, RpcServerUseProtseq ou RpcServerUseProtseqEx. Isso define a biblioteca de tempo de execução RPC para usar todas ou uma sequência de protocolo válida com pontos de extremidade dinâmicos. Em seguida, o servidor deve chamar RpcServerInqBindings para obter um conjunto de identificadores de associação válidos. O servidor passa o conjunto de identificadores de associação, ou vetor de associação, para a função RpcEpRegister para registrar todos os pontos de extremidade adequados no mapa do ponto de extremidade. Para cada chamada que seu servidor faz para RpcEpRegister, deve haver uma chamada correspondente para RpcBindingVectorFree para liberar a memória que o vetor de associação usa.
Observe que os programas de servidor podem usar a função RpcEpRegisterNoReplace em vez de RpcEpRegister. Os programas normalmente usam RpcEpRegisterNoReplace quando várias cópias de um programa de servidor devem ser executadas em um sistema de host do servidor.
As funções RpcEpRegister e RpcEpRegisterNoReplace adicionam as interfaces do servidor e os identificadores de associação ao banco de dados mapeador do ponto de extremidade. Quando o cliente faz uma chamada de procedimento remoto usando um identificador parcialmente associado, a biblioteca em tempo de execução do cliente solicita ao mapeador de ponto de extremidade do computador servidor o ponto de extremidade de uma instância de servidor compatível. A biblioteca de clientes fornece a interface UUID, a sequência de protocolo e, se presente, o UUID do objeto no identificador de associação do cliente. O mapeador de ponto de extremidade procura uma entrada de banco de dados que corresponda às informações do cliente. A interface do cliente/servidor UUID, a versão principal da interface e a sequência de protocolo devem corresponder exatamente. Além disso, a versão secundária da interface do servidor deve ser maior ou igual à versão secundária do cliente.
Se todos os testes forem bem-sucedidos, o mapeador de ponto de extremidade retornará o ponto de extremidade válido e a biblioteca em tempo de execução do cliente atualizará o ponto de extremidade no identificador de associação.
Os pontos de extremidade dinâmicos são limpos automaticamente do banco de dados mapeador do ponto de extremidade quando o processo do servidor para de ser executado. Você pode remover o ponto de extremidade do banco de dados mapeador do ponto de extremidade antes que o programa de servidor saia usando a função RpcEpUnregister ou permitir que a limpeza automática gerencie a remoção do ponto de extremidade.