Веб-сервер своими руками
Вот пара линков полезных: citforum.ru/programming/unix/sockets/ и allasm.ru/set_12.php
В целом логика под виндой и никсами одинаковая. Самое «сложное» в веб сервере — работа с сокетами. Работает примерно так:
1. Инициализируем сокеты;
2. Создаем (socket) — ОС выдаст нам новый сокет;
3. Настраиваем сокет (setsockopt);
4. Ассоциируем (bind) этот сокет с айпи и портом;
5. Начинаем «слушать»(listen) сокет — вообще, слушает ОС, а мы только обрабатываем данные;
6. В цикле принимаем (accept) соединения — accept возвращает управление и новый сокет как только появится запрос на указанные ранее порт и айпи (иначе INVALID_SOCKET вернет);
7. Начинаем асинхронный(для проверки/тестов все можно и в одном потоке делать) прием данных (recv) из полученного сокета;
8. Обрабатываем принятые данные.
9. Отправляем ответ (send);
10. После окончания приема закрываем сокет;
11. Возвращаемся в начало цикла — пункт 6. 
Само собой при асинхронной обработке цикл будет только получать новые сокеты и отдавать их «воркерам» — рабочим потокам.
В скобках — вызовы апи сокетов, под линуксом почти все то же самое.
Под виндой все сокеты в Ws2_32.dll.
Если что непонятно — отвечу в меру своих знаний 8)
mongoose прост для понимания (в исходниках)
сори, метки не заметил (а чего это я на питон подписан?)