Поделиться через


Структуры данных разрешения имен

Существует несколько важных структур данных, которые широко используются в функциях разрешения имен.

Структура WSAQUERYSET используется для формирования запросов для WSALookupServiceBegin и для доставки результатов запросов для WSALookupServiceNext. Это сложная структура, так как она содержит указатели на несколько других структур, некоторые из которых ссылаться на другие структуры. Связь между структурой WSAQUERYSET и структурами, на которые она ссылается, показана следующим образом.

связь между wsaqueryset и связанными с ним структурами

В структуре WSAQUERYSET большинство членов являются объяснительными, но некоторые из них заслуживают дополнительных объяснений. Член dwSize всегда должен быть заполнен параметром sizeof(WSAQUERYSET), так как он используется поставщиками пространства имен для обнаружения и адаптации к различным версиям структуры WSAQUERYSET , которые могут появиться со временем.

Член dwOutputFlags используется поставщиком пространства имен для предоставления дополнительных сведений о результатах запроса. Дополнительные сведения см. в функции WSALookupServiceNext .

Структура WSAECOMPARATOR , на которую ссылается член lpversion , используется как для ограничения запроса, так и для результатов. Для запросов член dwVersion указывает требуемую версию службы. Элемент ecHow — это перечислимый тип, указывающий способ сравнения. Варианты выбора COMP_EQUALS, для которых требуется точное совпадение в версии, или COMP_NOTLESS который указывает, что номер версии службы не меньше значения члена dwVersion .

Интерпретация dwNameSpace и lpNSProviderId зависит от того, как используется структура, и описывается далее в описаниях отдельных функций, использующих эту структуру.

Член lpszContext применяется к иерархическим пространствам имен и задает начальную точку запроса или расположение в иерархии, где находится служба. Общие правила

  • Значение NULL, пустое ("") запускает поиск в контексте по умолчанию.
  • Значение "\" запускает поиск в верхней части пространства имен.
  • Любое другое значение начинает поиск в указанной точке.

Поставщики, которые не поддерживают сдерживание, могут возвращать ошибку, если указано что-либо, отличное от "" или "\". Поставщики, поддерживающие ограниченное ограничение, например группы, должны принимать "", "\" или назначенную точку. Контексты зависят от пространства имен. Если член dwNameSpace NS_ALL, то в качестве контекста следует передавать только "" или "\", так как они распознаются всеми пространствами имен.

Член lpszQueryString используется для предоставления дополнительных сведений о запросах, относящихся к пространству имен, таких как строка, описывающая хорошо известное имя службы и транспортного протокола, например FTP/TCP.

Структура AFPROTOCOLS , на которую ссылается член lpafpProtocols , используется только в целях запроса и предоставляет список протоколов для ограничения запроса. Эти протоколы представлены в виде пар (семейство адресов, протокол), так как значения протоколов имеют значение только в контексте семейства адресов.

Массив структуры CSADDR_INFO , на который ссылается член lpcsaBuffer , содержит все сведения, необходимые для службы для установки прослушивания или для использования клиентом при установлении подключения к службе. Члены LocalAddr и RemoteAddr напрямую содержат SOCKET_ADDRESS структуру.

Служба создаст сокет, вызвав функцию socket или WSASocket с помощью кортежа LocalAddr.lpSockaddr-sa_family>, iSocketType и iProtocol в качестве параметров. Служба привязывает сокет к локальному адресу, вызывая функцию bind с помощью параметров LocalAddr.lpSockaddr и LocalAddr.lpSockaddrLength .

Клиент создает свой сокет, вызывая функцию socket или WSASocket, используя кортеж LocalAddr.lpSockaddr-sa_family>, iSocketType и iProtocol в качестве параметров. Клиент использует сочетание RemoteAddr.lpSockaddr и RemoteAddr.lpSockaddrLength в качестве параметров при создании удаленного подключения с помощью функции connect, ConnectEx или WSAConnect .

Структуры данных класса служб

При установке нового класса службы необходимо подготовить и предоставить структуру WSASERVICECLASSINFO . Эта структура также состоит из подструктур, содержащих ряд элементов, которые применяются к определенным пространствам имен. Структура данных сведений о классе выглядит следующим образом:

Архитектура структур данных класса службы

Для каждого класса службы существует одна структура WSASERVICECLASSINFO . В структуре WSASERVICECLASSINFO уникальный идентификатор класса службы содержится в элементе lpServiceClassId , а на связанную отображаемую строку ссылается член lpServiceClassName . Это строка, возвращаемая функцией WSAGetServiceClassNameByClassId .

Элемент lpClassInfos в структуре WSASERVICECLASSINFO ссылается на массив структур WSANSCLASSINFO , каждая из которых предоставляет именованный и типизированный член, который применяется к указанному пространству имен. Примеры значений для элемента lpszName : "SapId", "TcpPort", "UdpPort" и т. д. Эти строки обычно относятся к пространству имен, определенному в элементе dwNameSpace . Типичными значениями для элемента dwValueType могут быть REG_DWORD, REG_SZ и т. д. Член dwValueSize указывает длину элемента данных, на который указывает lpValue.

Вся коллекция данных, представленная в структуре WSASERVICECLASSINFO , предоставляется каждому поставщику пространства имен при вызове функции WSAInstallServiceClass . Затем каждый отдельный поставщик пространства имен просматривает список структур WSANSCLASSINFO и сохраняет сведения, применимые к нему.

AFPROTOCOLS

CSADDR_INFO

Модель разрешения имен

Независимое от протокола разрешение имен

Регистрация и разрешение имен

SOCKET_ADDRESS

Сводка функций разрешения имен

WSAECOMPARATOR

WSAGetServiceClassNameByClassId

WSAInstallServiceClass

WSALookupServiceBegin

WSAQUERYSET

WSASERVICECLASSINFO