[Перевод] Обслуживание HTML из MS-DOS
Отсутствующий в MS-DOS стек протоколов TCP/IP всегда был поводом для жарких дискуссий — и это при том, что изначально его поддержка в ОС не планировалась вовсе. И дело вовсе не в том, что MS-DOS он был бы не по силам. TCP/IP на момент разработки DOS еще не был реализован самой Microsoft. Разве что в Windows 3.11 промелькнул IPX/SPX. Окончательно утвердился стек TCP/IP только в Windows 95.
Тем не менее, благодаря потрясающей работе по созданию бэкпортов, проделанной множеством энтузиастов по всему миру, TCP/IP всё же удалось заставить работать в MS-DOS. В эмуляторе 86Box можно установить виртуальную сетевую карту, загрузить её драйверы и запустить TCP/IP. При этом получится даже просматривать веб-страницы. Но сейчас мы сделаем нечто еще более дикое. Заставим нашу виртуальную MS-DOS машину работать в качестве веб-сервера и разместим на нем свою HTML-страницу. Приступим!
Виртуальное шаманство
Первым делом определимся с конфигурацией 86Box. Я выбрал Intel 80386 и сетевую карту AMD, так как стек TCP/IP привередлив и работает лишь с избранными картами. В частности, используемая по умолчанию Novel NE2000 ему не подходит. Зато AMD и Realtek RTL8019AS успешно прошли тест. Конфигурация системы в результате будет такой:
Конфигурация для машины Intel 80386 в 86Box
Обратите внимание на скромный объем оперативной памяти и процессор с частотой 33 МГц. В ходе своих зверских экспериментов я хотел подвергнуть процессор максимальной нагрузке. Теперь переходим к сетевой карте:
Виртуальная сетевая карта AMD в 86box
Для виртуальной сетевой карты AMD PCnet ISA мы будем использовать режим SLiRP. Это означает установленный в 86Box-машине виртуальный маршрутизатор, подключенный к виртуальному DHCP-серверу. Он и предоставит ей IP-адрес 10.0.2.15 с подсетью 225.225.225.0 и DNS 10.0.2.2. 86Box будет иметь доступ к интернету через хост, но он сам к ней обращаться не сможет.
Поскольку мы хотим использовать систему в качестве веб-сервера, необходима дополнительная настройка. Для этого открываем файл 86box.cfg, хранящийся в папке виртуальной машины:
Файл конфигурации виртуальной машины MS-DOS в 86Box
Добавим код для переадресации портов:
[SLiRP Port Forwarding #1]
0_external = 8080
0_internal = 80
Таким образом мы добавили переадресацию портов для нашей виртуальной сетевой карты AMD ISA. Весь трафик с внешнего порта 8080 перенаправится на внутренний 80-й порт. Это означает, что виртуальная машина 86Box будет обслуживать HTML-контент через порт 80, а хост-машина запрашивать его через порт 8080. Иначе говоря, веб-сервер MS-DOS, прослушивая порт 80, получит мои запросы через браузер реальной машины по адресу 127.0.0.1:8080.
Обратите внимание на параметры 0_internal и 0_external. Ноль обозначает индекс правила переадресации портов. Правил может быть несколько. Например, для переадресации как TCP, так и UDP нужно добавить следующие строки:
[SLiRP Port Forwarding #1]
0_external = 8080
0_internal = 80
1_external = 5000
1_internal = 50
1_protocol = udp
Наш файл 86box.cfg в конечном итоге будет выглядеть так:
Файл 86box.cfg в VSCode с добавленной переадресацией портов
Сетевые драйверы и стеки TCP/IP
Настроенная для работы с сетью виртуальная машина в 86Box
Настройка оборудования завершена, пришло время включить виртуальную машину. На показанном выше скриншоте виден результат. Осталось только запустить сетевой драйвер. Можно скачать его здесь или с моей страницы на GitHub. Архив на моем GitHub называется amdnet.zip и содержит как драйвер сетевой карты, так и драйвер стека TCP/IP. Драйвер сетевой карты называется pcntpk.exe, и можно запустить его, указав адрес сетевой карты (по умолчанию 0×60):
C:\>PCNTPK INT=0x60
После установки карты мы получим MAC-адрес:
Установка сетевой карты AMD PCI в 86Box прошла успешно
Следующим шагом будет установка стека TCP/IP. Для этого запустим ntcpdrv.exe без параметров:
Стек TCP/IP установлен
IP-адрес 10.0.2.15, упоминаемый ранее, получен. Всё готово для работы с HTML-файлами!
Веб-серверы
Поначалу казалось, что поиск веб-серверов для MS-DOS будет нелёгким занятием. Но ситуация оказалась более похожа на хороший нуарный фильм с неожиданными поворотами сюжета. Как выяснилось, существует множество веб-серверов для MS-DOS, а некоторые из них даже реализуют обработку нескольких запросов одновременно. Один из веб-серверов даже построен на Бейсике. Разработчики MS-DOS могли бы гордиться!
Первый, из опробованных мной, назывался Sioux и мог обрабатывать несколько запросов одновременно. Разработчик даже поделился ссылкой на драйверы. Именно она предоставлена мной выше для сетевой карты AMD. Но, к сожалению, у меня этот вариант не сработал:
Загадочная ошибка при запуске веб-сервера Sioux
Повсюду я пытался найти описание этой ошибки. Наталкивался на упоминания об отказе в доступе, о чём-то совершенно ином. Что, вероятно, это каким-то боком связано с PowerBasic. Но ничего путного я так и не узнал ни о самой ошибке, ни о том, что за ней стоит. О PowerBasic я вообще никакого представления не имею, поэтому стал тестировать другой веб-сервер. И этот заработал. Написан он был на Бейсике и оказался весьма заморочным. Но при этом обладал даже лаконичным текстовым пользовательским интерфейсом:
Запуск webserv.exe на машине Intel 386 в 86Box
После его запуска для прослушивания выбирается порт 80. Переадресация уже настроена, осталось только открыть браузер, набрать адрес локального хоста и порт 8080. Перед нами веб-страница по умолчанию:
Наш веб-сервер MS-DOS готов к работе
Веб-файлы загружаются из папки HTDOCS:
Список файлов в папке WebServ веб-сервера MS-DOS
В ней находятся файл index.htm и изображение инопланетянина с большим пальцем вверх:
Файлы веб-сайта по умолчанию
Как и было заявлено, веб-сервер поддерживает CGI-скрипты, что позволяет отправлять данные на страницу с помощью HTML-форм. Оказалось, что это не последняя версия данного веб-сервера (версия 0.9). На одном забытом форуме обнаружилась еще более новая под названием QuikServ 1.1, обладающая рядом преимуществ, включая одновременную обработку нескольких запросов. Структура файлов несколько изменилась, но обслуживаемая веб-страница по-прежнему находится в той же папке HTDOCS:
Файловая структура QuikServ 1.1 в 86Box
Запустив сервер, мы видим несколько изменённый интерфейс, а также информацию о еще одной недавно реализованной функции — поддержке FTP:
Текстовый интерфейс QuikServ 1.1
Теперь проверим веб-сайт по умолчанию:
Веб-сайт по умолчанию, предлагаемый QuikServ 1.1
Но на этом попытки не закончились. Мне удалось найти еще один веб-сервер, написанный на MoonRock, языке программирования, разработанном автором веб-сервера. Создать целый язык программирования и веб-сервер на нём, да ещё для MS-DOS — как вам это?
Очевидно, MS-DOS умерла слишком рано:
Каталог с простым названием WWW содержит короткий список файлов
Итак, давайте запустим его, набрав команду www.com:
Текстовый пользовательский интерфейс веб-сервера WWW
Текстовый интерфейс достаточно удобный и приятный. К сожалению, этот сервер не предоставляет веб-сайт по умолчанию, поэтому вызов его через порт 8080 локального хоста ничего нам не даст:
Странная ошибка 404 от веб-сервера MS-DOS
Однако сам сервер распознает вызов и дает полное описание неисправности:
Объект index.html не найден
На этом и закончим. Обширное семейство веб-серверов MS-DOS… Одни из них написаны на BASIC, другие на PowerBasic, а третьи по загадочным причинам на MoonRock. Сказать по правде, такое упорство меня просто восхищает! Да и вообще при написании этой статьи каждая мелочь, каждая деталь доставляла удовольствие. Надеюсь, что и вы почувствуете нечто подобное, возможно, даже и опробуете некоторые из этих серверов. В таком случае труд энтузиастов-программистов будет по достоинству вознаграждён! Спасибо за чтение, до следующих встреч!