Проектная лаборатория

Собственный DNS-сервер

0 / 8этапов пройдено

Этап 06 · Основные этапы

Разбор раздела вопросов

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы расширите DNS-сервер, чтобы он разбирал раздел вопросов полученного DNS-сообщения.

Как и на предыдущем этапе, тестирующая система запустит вашу программу следующим образом:

./your_program.sh

Затем она отправит на порт 2053 UDP-пакет с DNS-запросом, содержащим следующий раздел вопросов:

Поле Значение, отправленное тестирующей системой
Name Случайное доменное имя, закодированное последовательностью меток (подробнее см. этап №3)
Type 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует типу записи «A»)
Class 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует классу записи «IN»)

На этом этапе тип вопроса всегда будет A, а класс — IN. Поэтому пока вашему парсеру достаточно поддерживать только эти значения.

Ваша программа должна отправить ответный DNS-пакет, содержащий:

  • раздел заголовка (как на этапе №5);
  • раздел вопросов (новое на этом этапе);
  • раздел ответов (новое на этом этапе).

Ожидаемые значения раздела вопросов:

Поле Ожидаемое значение
Name Повторить доменное имя (в виде последовательности меток)
Type 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует типу записи «A»)
Class 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует классу записи «IN»)

Ожидаемые значения раздела ответов:

Поле Ожидаемое значение
Name Повторить доменное имя (в виде последовательности меток)
Type 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует типу записи «A»)
Class 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует классу записи «IN»)
TTL Любое значение, закодированное как 4-байтовое целое число с порядком байтов big-endian. Например: 60.
Length 4, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует длине поля RDATA)
Data Любой IP-адрес, закодированный как 4-байтовое целое число с порядком байтов big-endian. Например: \x08\x08\x08\x08 (это 8.8.8.8, закодированный как 4-байтовое целое число)

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init dns-server ./my-dns-server --language go

2. Откройте папку в IDE

cd ./my-dns-server

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage hd8

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста