Compartilhar via


Estruturas de dados de resolução de nomes

Há várias estruturas de dados importantes que são usadas extensivamente em todas as funções de resolução de nomes.

A estrutura WSAQUERYSET é usada para formar consultas para WSALookupServiceBegin e usada para fornecer resultados de consulta para WSALookupServiceNext. É uma estrutura complexa, pois contém ponteiros para várias outras estruturas, algumas das quais fazem referência a outras estruturas. A relação entre a estrutura WSAQUERYSET e as estruturas que ela faz referência é ilustrada da seguinte maneira.

relação entre wsaqueryset e suas estruturas associadas

Dentro da estrutura WSAQUERYSET , a maior parte do membro é autoexplicativa, mas algumas merecem explicação adicional. O membro dwSize sempre deve ser preenchido com sizeof(WSAQUERYSET), pois isso é usado por provedores de namespace para detectar e adaptar-se a diferentes versões da estrutura WSAQUERYSET que podem aparecer ao longo do tempo.

O membro dwOutputFlags é usado por um provedor de namespace para fornecer informações adicionais sobre os resultados da consulta. Para obter detalhes, consulte a função WSALookupServiceNext .

A estrutura WSAECOMPARATOR referenciada pelo membro lpversion é usada para restrição de consulta e resultados. Para consultas, o membro dwVersion indica a versão desejada do serviço. O membro ecHow é um tipo enumerado que especifica como a comparação pode ser feita. As opções são COMP_EQUALS que exigem que ocorra uma correspondência exata na versão ou COMP_NOTLESS que especifica que o número de versão do serviço não seja menor que o valor do membro dwVersion .

A interpretação de dwNameSpace e lpNSProviderId depende de como a estrutura está sendo usada e é descrita ainda mais nas descrições de função individuais que utilizam essa estrutura.

O membro lpszContext aplica-se a namespaces hierárquicos e especifica o ponto de partida de uma consulta ou o local dentro da hierarquia em que o serviço reside. As regras gerais são:

  • Um valor nulo, em branco ("") inicia a pesquisa no contexto padrão.
  • Um valor de "\" inicia a pesquisa na parte superior do namespace.
  • Qualquer outro valor inicia a pesquisa no ponto designado.

Provedores que não dão suporte à contenção poderão retornar um erro se algo diferente de "" ou "\" for especificado. Os provedores que dão suporte à contenção limitada, como grupos, devem aceitar "", "\" ou um ponto designado. Os contextos são específicos do namespace. Se o membro dwNameSpace for NS_ALL, somente "" ou "\" deverá ser passado como o contexto, pois eles são reconhecidos por todos os namespaces.

O membro lpszQueryString é usado para fornecer informações adicionais de consulta específicas do namespace, como uma cadeia de caracteres que descreve um nome de protocolo de transporte e serviço conhecido, como em "FTP/TCP".

A estrutura AFPROTOCOLS referenciada pelo membro lpafpProtocols é usada apenas para fins de consulta e fornece uma lista de protocolos para restringir a consulta. Esses protocolos são representados como pares (família de endereços, protocolo), pois os valores de protocolo só têm significado dentro do contexto de uma família de endereços.

A matriz da estrutura CSADDR_INFO referenciada pelo membro lpcsaBuffer contém todas as informações necessárias para um serviço usar no estabelecimento de uma escuta ou para um cliente usar no estabelecimento de uma conexão com o serviço. Os membros LocalAddr e RemoteAddr contêm diretamente uma estrutura SOCKET_ADDRESS .

Um serviço criaria um soquete chamando o soquete ou a função WSASocket usando a tupla de LocalAddr.lpSockaddr-sa_family>, iSocketType e iProtocol como parâmetros. Um serviço associaria o soquete a um endereço local chamando a função bind usando LocalAddr.lpSockaddr e LocalAddr.lpSockaddrLength como parâmetros.

Um cliente cria seu soquete chamando o soquete ou a função WSASocket usando a tupla de LocalAddr.lpSockaddr-sa_family>, iSocketType e iProtocol como parâmetros. Um cliente usa a combinação de RemoteAddr.lpSockaddr e RemoteAddr.lpSockaddrLength como parâmetros ao fazer uma conexão remota usando a função connect, ConnectEx ou WSAConnect .

Estruturas de dados da classe de serviço

Quando uma nova classe de serviço é instalada, uma estrutura WSASERVICECLASSINFO deve ser preparada e fornecida. Essa estrutura também consiste em subestruturas que contêm uma série de membros que se aplicam a namespaces específicos. Uma estrutura de dados de informações de classe é a seguinte:

arquitetura de estruturas de dados da classe de serviço

Para cada classe de serviço, há uma única estrutura WSASERVICECLASSINFO . Dentro da estrutura WSASERVICECLASSINFO , o identificador exclusivo da classe de serviço está contido no membro lpServiceClassId e uma cadeia de caracteres de exibição associada é referenciada pelo membro lpServiceClassName . Essa é a cadeia de caracteres retornada pela função WSAGetServiceClassNameByClassId .

O membro lpClassInfos na estrutura WSASERVICECLASSINFO faz referência a uma matriz de estruturas WSANSCLASSINFO , cada uma das quais fornece um membro nomeado e tipado que se aplica a um namespace especificado. Exemplos de valores para o membro lpszName incluem: "SapId", "TcpPort", "UdpPort" etc. Essas cadeias de caracteres geralmente são específicas para o namespace identificado no membro dwNameSpace . Valores típicos para o membro dwValueType podem ser REG_DWORD, REG_SZ etc. O membro dwValueSize indica o comprimento do item de dados apontado por lpValue.

Toda a coleção de dados representada em uma estrutura WSASERVICECLASSINFO é fornecida a cada provedor de namespace quando a função WSAInstallServiceClass é invocada. Cada provedor de namespace individual, em seguida, examina a lista de estruturas WSANSCLASSINFO e retém as informações aplicáveis a ele.

AFPROTOCOLS

CSADDR_INFO

Modelo de Resolução de Nomes

Resolução de nomes independentes de protocolo

Registro e Resolução de Nomes

SOCKET_ADDRESS

Resumo das funções de resolução de nomes

WSAECOMPARATOR

WSAGetServiceClassNameByClassId

WSAInstallServiceClass

Wsalookupservicebegin

WSAQUERYSET

WSASERVICECLASSINFO