Получение доступа к системе доменных имен

Для доступа к системе доменных имен семейства протоколов TCP/IP в библиотеке сокетов предусмотрен набор из пяти процедур. Прикладные программы, вызывающие эти подпрограммы, становятся клиентами одной большой системы доменных имен, отсылая запросы одному или нескольким серверам и получая на них ответы.

Идея заключается в том, что программа делает запрос одному серверу и ожидает от него ответа. Поскольку при этом существует большое количество разных параметров, в подпрограммы передаются только основные параметры, а остальные хранятся в глобальной структуре, которая называется res. Например, одно из полей структуры res отвечает за рассылку отладочных сообщений, в то время как другое позволяет установить тип протокола (UDP или TCP), который будет использоваться для отправки запросов прикладной программой. Для большинства полей структуры res назначены подходящие значения по умолчанию, поэтому без особой необходимости их менять не нужно.

Перед использованием других процедур прикладная программа должна вызывать функцию res_init без параметров:

res_init()

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

Процедура res_mkquery формирует запрос к серверу доменных имен и помещает его во внутренний буфер памяти. Она имеет следующий синтаксис:

res_mkquery{код,  адрес-имени,  класс,   тип,  адрес-данных, длина-данных, не-исп, адрес-буфера, длина-буфера)

Первые семь параметров соответствуют полям запроса, посылаемого серверу доменных имен. Параметр код определяет затребованную операцию; параметр адрес-имени задает адрес массива символов, содержащего доменное имя; параметр класс — это целое число, которое указывает класс запроса; параметр тип — целое число, которое указывает тип запроса; параметр адрес-данных указывает адрес массива данных, которые будут включены в запрос, а параметр длина-данных представляет собой целое число, которое определяет длину данных. Помимо библиотечных процедур, в API сокетов предусмотрены специальные символические определения для важных констант, которые используются в прикладных программах. Таким образом, программисты могут использовать систему доменных имен, не располагая при этом глубокими знаниями о деталях работы протокола. Два последних параметра, адрес-буфера и длина-буфера, определяют, соответственно, адрес области, в которую необходимо поместить запрос, и выраженную целым числом длину этой области. Следует отметить, что в текущей реализации параметр не-исп не используется.

Сформировав запрос, программа вызывает функцию res_send, чтобы отослать его серверу доменных имен и получить на него ответ. Эта функция имеет следующий синтаксис:

res_send(адрес-буфера, длина-буфера, адрес-ответа, длина-ответа)

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

Помимо подпрограмм, создающих и отсылающих запросы, в библиотеку сокетов входят две подпрограммы, которые выполняют преобразование доменных имен между стандартным форматом ASCII и сжатым форматом, используемым в запросах. Процедура dn_expand расширяет доменное имя и представляет его в виде ASCII-строки. Эта процедура имеет следующий синтаксис:

dn_expand(адрес-сообщения, конец-сообщения, адр- ежа того-имени, адрес-буфера, длина-буфера)

Параметр адрес-сообщения задает адрес сообщения службы доменных имен, который содержит имя для расширения. Параметр конец-сообщения определяет границы конца сообщения, за пределы которых расширение продолжаться не может. Параметр адр- ежа того-имени является указателем на первый байт сжатого имени. Параметр адрес-буфера — это адрес массива, в который необходимо записать расширенное имя, а параметр длина-буфера — целое число, определяющее длину массива.

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

dn_comp{адрес-имени,  адр- ежа того-имени, длина-сжатого-имени, адр-мас-указ, указ-конца-мае)

Параметр адрес-имени задает адрес полного доменного имени. Параметр адр-сжатого-имени указывает на массив байтов, в котором будет храниться сжатое имя, а параметр длина-сжатого-имени определяет длину этого массива. Параметр адр-мас-указ — адрес массива указателей на ранее сжатые окончания, а параметр указ-конца-мае содержит адрес конца массива. Как правило, процедура dn_comp сжимает имя и обновляет массив указателей, адрес которого задан параметром адр-мас-указ, если было использовано новое окончание.

Процедуру dn_comp можно также использовать для преобразования доменного имени из формата ASCII во внутреннюю форму, не прибегая при этом к сжатию (т.е. не удаляя окончания). Для этого при ее вызове в качестве параметра адр-мас-указ необходимо указать значение NULL (т.е. двоичный нуль).

Похожие статьи Меню Опрос Фото Популярное