C/C++. Сетевое программирование. Создание веб-сервера. Часть 1

Создание веб - сервера. Громко сказано конечно :) Да и есть ли в этом необходимость, когда уже созданы такие веб - сервера, как, из самых известных:
- Apache и Apache Tomcat (Sun Microsystems);
- разработка Игоря Сысоева - Nginx;
- разработка компании Microsoft - IIS (Internet Information Services).
Но помимо этого есть и альтернативные разработки: Ascet HTTPd, CERN httpd и другие. С таким списком можно ознакомиться на Wiki.

Лично для меня архитектура и логика работы веб - сервера вызывает интерес.
Все мы знаем, что многоликий интернет базируется на работе раскинутых веб - серверов, связанных между собой в глобальную сеть за счет различных сетевых устройств. Например - роутеров, маршрутизаторов, коммутаторов и тому подобное. Опустим технические нюансы. Потребители интернета со своих машин также подключены к этой сети. И через соответствующие сетевые программы, так называемые -  User-agent - браузеры (от англ. browse - проссматривать) просматривают (точнее - запрашивают) веб - странички, которые располагаются на веб - серверах. Помимо содержания веб - страниц, веб - сервер может содержать и скриптовую часть. Мини-экскурс :) Но я пошел дальше.

Как можно разработать свой веб - сервер на C/C++?

Для этого воспользуемся прикладным интерфейсом - Windows Socket API (Winsock).

Прежде, чем приступать к программированию на данном интерфейсе, рассмотрим общие характеристики веб - серверов:
- в простейшем случае используют http - протокол и зарезервированный порт - 80, 8080;
- сервер принимает запросы от браузеров и отправляет им ответы в строго определенном виде. Определение запросов и ответов представлены в специальных документах, так называемым - Internet Request For Comment (RFC), в частности - RFC 2086. Рассмотрим пример диалогов HTTP (более подробно можно ознакомиться на Wiki).

Запрос клиента:
GET /wiki/страница HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509
Firefox/3.0b5
Accept: text/html
Connection: close
(пустая строка) 
 
Ответ сервера:
HTTP/1.1 200 OK
Date: Wed, 11 Feb 2009 11:20:59 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5wm1
Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Content-Language: ru
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: close

(далее следует запрошенная страница в HTML) 
 
Отсюда видна структурированность HTTP диалога между клиентами и веб - серверами.
Так как мы рассматриваем разработку серверной стороны, стоит более внимательно
посмотреть на процесс формирования ответа сервера на сторонние запросы. Для
этого приведем схему;
 
 
 
 
 
 





- GET и POST методы передачи данных на сервер;
- скриптовая часть. Для этого организовываются внешние потоки, в которых происходит инициализация внешних скриптов на основе cgi, php, perl и даже bat - файлов;