[Перевод] Обслуживание 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-страницу. Приступим!

2c4a771bc7dd75308d1d3a9f35469691.png

Виртуальное шаманство

Фото от Фредди Джекоба на Unsplash

Первым делом определимся с конфигурацией 86Box. Я выбрал Intel 80386 и сетевую карту AMD, так как стек TCP/IP привередлив и работает лишь с избранными картами. В частности, используемая по умолчанию Novel NE2000 ему не подходит. Зато AMD и Realtek RTL8019AS успешно прошли тест. Конфигурация системы в результате будет такой:

Конфигурация для машины Intel 80386 в 86Box

Конфигурация для машины Intel 80386 в 86Box

Обратите внимание на скромный объем оперативной памяти и процессор с частотой 33 МГц. В ходе своих зверских экспериментов я хотел подвергнуть процессор максимальной нагрузке. Теперь переходим к сетевой карте:

Виртуальная сетевая карта AMD в 86box

Виртуальная сетевая карта 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

Файл конфигурации виртуальной машины 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 с добавленной переадресацией портов

Файл 86box.cfg в VSCode с добавленной переадресацией портов

Сетевые драйверы и стеки TCP/IP

Настроенная для работы с сетью виртуальная машина в 86Box

Настроенная для работы с сетью виртуальная машина в 86Box

Настройка оборудования завершена, пришло время включить виртуальную машину. На показанном выше скриншоте виден результат. Осталось только запустить сетевой драйвер. Можно скачать его здесь или с моей страницы на GitHub. Архив на моем GitHub называется amdnet.zip и содержит как драйвер сетевой карты, так и драйвер стека TCP/IP. Драйвер сетевой карты называется pcntpk.exe, и можно запустить его, указав адрес сетевой карты (по умолчанию 0×60):

C:\>PCNTPK INT=0x60

После установки карты мы получим MAC-адрес:

Установка сетевой карты AMD PCI в 86Box прошла успешно

Установка сетевой карты AMD PCI в 86Box прошла успешно

Следующим шагом будет установка стека TCP/IP. Для этого запустим ntcpdrv.exe без параметров:

Стек TCP/IP установлен

Стек TCP/IP установлен

IP-адрес 10.0.2.15, упоминаемый ранее, получен. Всё готово для работы с HTML-файлами!

Веб-серверы

Фото от NASA на Unsplash

Поначалу казалось, что поиск веб-серверов для MS-DOS будет нелёгким занятием. Но ситуация оказалась более похожа на хороший нуарный фильм с неожиданными поворотами сюжета. Как выяснилось, существует множество веб-серверов для MS-DOS, а некоторые из них даже реализуют обработку нескольких запросов одновременно. Один из веб-серверов даже построен на Бейсике. Разработчики MS-DOS могли бы гордиться!

Первый, из опробованных мной, назывался Sioux и мог обрабатывать несколько запросов одновременно. Разработчик даже поделился ссылкой на драйверы. Именно она предоставлена мной выше для сетевой карты AMD. Но, к сожалению, у меня этот вариант не сработал:

Загадочная ошибка при запуске веб-сервера Sioux

Загадочная ошибка при запуске веб-сервера Sioux

Повсюду я пытался найти описание этой ошибки. Наталкивался на упоминания об отказе в доступе, о чём-то совершенно ином. Что, вероятно, это каким-то боком связано с PowerBasic. Но ничего путного я так и не узнал ни о самой ошибке, ни о том, что за ней стоит. О PowerBasic я вообще никакого представления не имею, поэтому стал тестировать другой веб-сервер. И этот заработал. Написан он был на Бейсике и оказался весьма заморочным. Но при этом обладал даже лаконичным текстовым пользовательским интерфейсом:

Запуск webserv.exe на машине Intel 386 в 86Box

Запуск webserv.exe на машине Intel 386 в 86Box

После его запуска для прослушивания выбирается порт 80. Переадресация уже настроена, осталось только открыть браузер, набрать адрес локального хоста и порт 8080. Перед нами веб-страница по умолчанию:

Наш веб-сервер MS-DOS готов к работе

Наш веб-сервер MS-DOS готов к работе

Веб-файлы загружаются из папки HTDOCS:

Список файлов в папке WebServ веб-сервера MS-DOS

Список файлов в папке WebServ веб-сервера MS-DOS

В ней находятся файл index.htm и изображение инопланетянина с большим пальцем вверх:

Файлы веб-сайта по умолчанию

Файлы веб-сайта по умолчанию

Как и было заявлено, веб-сервер поддерживает CGI-скрипты, что позволяет отправлять данные на страницу с помощью HTML-форм. Оказалось, что это не последняя версия данного веб-сервера (версия 0.9). На одном забытом форуме обнаружилась еще более новая под названием QuikServ 1.1, обладающая рядом преимуществ, включая одновременную обработку нескольких запросов. Структура файлов несколько изменилась, но обслуживаемая веб-страница по-прежнему находится в той же папке HTDOCS:

Файловая структура QuikServ 1.1 в 86Box

Файловая структура QuikServ 1.1 в 86Box

Запустив сервер, мы видим несколько изменённый интерфейс, а также информацию о еще одной недавно реализованной функции — поддержке FTP:

Текстовый интерфейс QuikServ 1.1

Текстовый интерфейс QuikServ 1.1

Теперь проверим веб-сайт по умолчанию:

Веб-сайт по умолчанию, предлагаемый QuikServ 1.1

Веб-сайт по умолчанию, предлагаемый QuikServ 1.1

Но на этом попытки не закончились. Мне удалось найти еще один веб-сервер, написанный на MoonRock, языке программирования, разработанном автором веб-сервера. Создать целый язык программирования и веб-сервер на нём, да ещё для MS-DOS — как вам это?  

Очевидно, MS-DOS умерла слишком рано:

Каталог с простым названием WWW содержит короткий список файлов

Каталог с простым названием WWW содержит короткий список файлов

Итак, давайте запустим его, набрав команду www.com:

Текстовый пользовательский интерфейс веб-сервера WWW

Текстовый пользовательский интерфейс веб-сервера WWW

Текстовый интерфейс достаточно удобный и приятный. К сожалению, этот сервер не предоставляет веб-сайт по умолчанию, поэтому вызов его через порт 8080 локального хоста ничего нам не даст:

Странная ошибка 404 от веб-сервера MS-DOS

Странная ошибка 404 от веб-сервера MS-DOS

Однако сам сервер распознает вызов и дает полное описание неисправности:

Объект index.html не найден

Объект index.html не найден

На этом и закончим. Обширное семейство веб-серверов MS-DOS… Одни из них написаны на BASIC, другие на PowerBasic, а третьи по загадочным причинам на MoonRock. Сказать по правде, такое упорство меня просто восхищает! Да и вообще при написании этой статьи каждая мелочь, каждая деталь доставляла удовольствие. Надеюсь, что и вы почувствуете нечто подобное, возможно, даже и опробуете некоторые из этих серверов. В таком случае труд энтузиастов-программистов будет по достоинству вознаграждён! Спасибо за чтение, до следующих встреч!

© Habrahabr.ru