Докладчик: Теперь давайте перейдем в код распределения
и взглянуть на контекст в котором написанный вами код
будет, будет функционировать.
В конце концов, Вы собираетесь осуществить
Совокупность веб-сервера.
Но мы предоставили Вы со скелетом
код, который есть некоторые функциональные возможности, особенно связанных с сетями.
Давайте взглянем.
>> Так здесь к вершине файла является связка
из функции проверки макросов требованиям.
Теперь это просто особенность С, в результате чего в соответствии с кучей искусственных страниц
Вы должны определить некоторые Эти константы, чтобы быть правдой
или быть даже конкретные цифры так, что у вас есть доступ к определенным функциям.
В противном случае они будут Необъявленная и вы не будете иметь доступ.
Так что я сделал это путем читать справочные страницы.
Теперь внизу, в линии 15 через 17, мы
есть целая куча ограничений, заявленных.
>> И мы заимствовали их из популярный веб-сервер, называемый Apache.
И это только Номера, которые собираются
ограничить общее количество байтов, которые разрешены
в различных контекстах для запроса HTTP что браузер может посылать меня.
Далее, мы определяем октета.
Теперь октет просто причудливый способ сказать байт, или восьми битов.
Оказывается, в прошлых байт не обязательно было восемь бит,
так октет всегда восемь бит.
Таким образом, в этом случае мы приняли что общего в сети
Мир называя восемь байт октета.
>> Здесь я уточнил, что октета будет быть 512, так что так же, как в судебно-медицинской экспертизы
когда мы читаем кучу байт в то время, и здесь,
мы будем читать куча октетов в то время.
Следующая целой кучей файлов заголовков.
Как я знаю, включить их?
Ну, я просто читать человека страниц для ряда функций
что мы будем использовать в этом распределении код и включить в них
Мне было поручено.
>> И теперь у нас есть тип данных.
Мы объявляем, что октет быть символ.
И мы увидим позже, что это используемый в коде.
И мы объявили целая куча прототипов,
и мы быстро пройти через каждый из этих функций.
Наконец, и, возможно, наиболее Важно иметь в
ум в данный момент в история, является то, что
, на самом деле вся куча глобальных переменных
в верхней части файла, корень, CFD, ЮФО, просьба, файлов и тело.
>> Теперь, как правило, с использованием так много глобальных переменные или глобальные переменные вообще,
не вернулся практике.
Но, оказывается, мы также используем метод, называемый обработка сигналов позже
в коде, что позволяет нам определить, когда пользователь нажимает что-то
как CTRL-C и закрыть Сервер изящно.
А для того, чтобы сделать это изящно а на самом деле освободить память,
мы должны иметь доступ к Эти глобальные переменные.
>> А теперь давайте взглянем на-Майне, который диски полноту этой программы.
Во-первых, в верхней здесь есть номер переменной ошибке
что, кажется, не есть тип, но это
потому что это на самом деле определены в файле под названием
Ошибка errno.h, которые включен выше.
Если вы человек ERRNO на самом деле определение см за это дело,
Вы увидите, что это специальная глобальная переменная, которая
устанавливается целый букет функций не написано
нами, но авторы Linux и другие системы, чтобы фактически установить
Количество этой переменной, когда что-то идет не так, так что вы можете во всем мире
выяснить, что же идет не так.
>> Теперь внизу вы увидите новый Техника возможно, с использованием Getopt,
функция, которая помогает разбора команды аргументы командной строки, так что мы не
придется беспокоиться бесполезной траты времени на выяснение как разобрать что-то вроде 8080,
или тире р, или тире ч, чтобы получить помощь.
Getopt по существу делает это за нас.
Обратитесь к странице Справочника больше.
>> Далее, мы делаем немного ошибок проверка, чтобы убедиться,
что номер порта в пределах Указанный диапазон в спецификации.
Далее, мы видим вызов функции начать, определение которого мы
Посмотрите, в мгновение, и как его имя предлагает, это начинает веб-сервер.
Здесь мы имеем вызов функции называется сигнал, который говорит,
если и когда вы слышите управления С от Клавиатура пользователя, идти вперед и называть
обработчик Функция называется, что происходит в конечном счете, чистые вещи и перестать
сервер.
>> Ниже это то, что, как представляется, бесконечный цикл, первая линия которого
эффективно, это вызов для вызова функции
сброс, который мы берем на себя осуществить позже в порядке
чтобы освободить некоторые из наших глобальных состояний.
После этого это линия код, который условно
проверяет возвращение Значение связи.
Теперь, связанные выглядит как предикат, то, что возвращает истину или ложь.
И это делает, но есть что-то особенное в связи
в том, что это вызывает блокировку.
Он будет сидеть и ждать пока браузере пользователя
пытается подключиться к этой сети сервер и только тогда она сможет
вернуться истинным или ложным, так что мы исходим к внутренней этом, если заявление.
>> Когда-то, заметьте, эту функцию Функция называется разбора, о котором мы писали,
который анализирует все октетов, все байтов, поступающих из-браузер
на сервере, так что мы можем передать Вы снова в конечном счете, значение одного
из тех глобальных переменных, которые сохраняет все байт в просто
заголовки, что запрос, а не тело
если на самом деле было тело к нему.
>> Теперь внизу мы начинаем разобрать эти заголовки, чтобы извлечь
подмножество информации что мы заботимся о.
В частности, в спецификация, мы сначала
хотел просить линия, которая является Просто очень первая строка, которая
мы надеемся, говорит что-то вроде Get сократить или какой-либо путь, а затем HTTP 1.1.
Мы используем эту метафору иглы в стоге сена
искать частности символы или адреса.
И в самом деле, есть ряд функции в нашем коде распределения
что вы тоже могут оказаться полезными при поиске конкретных значений.
>> В конечном счете, мы копируем эти байты в переменной с именем линии,
которые заметили, слишком, мы в стеке
путем динамического размера массива.
И мы сознательно пытается чтобы избежать вызова таНос
потому что снова, потому что из-под контроля C является
Потенциал особенностью этой программы, мы не хотите, чтобы этот код вдруг
прервано пользователем удара Контроль С, в результате которой
является то, что я не мог есть шанс для свободного то я malloced.
Так что я пытаюсь использовать так много стека, я можете здесь.
>> Затем, целым букетом в DOS.
Спецификация изложить на то, что ожидается здесь,
но комментарии вам намек на то, что лежит впереди.
Сначала вы должны проверить строку запроса
и убедитесь, что она выглядит как Характеристики грамматики, так сказать,
говорит, что надо.
Затем нужно извлечь что-то называется запрос, вещество, из
после вопросительного знака, как мы видели наш пример Google
Попутно в параметре HD.
Мы затем соедините вместе корень веб-сервера
с пути, которая находится в что запрос на первой линии
и образуют полный путь файл, который мы хотим искать.
>> После этого, мы собираемся, чтобы убедиться, что файл существует и доступен для чтения.
А потом мы собираемся извлечь его Расширение файла, .html или .php,
или некоторые такие расширение, которое по крайней самый конец строки просил.
Далее идет вся куча кода, который мы написали
на самом деле генерировать PHP контент для вас.
В двух словах, это код берет во имя
файла, который вы хотите PHP для интерпретации.
Мы проходим его, что называется труба в переводчика PHP.
Получить обратно ответ, как будто Ответ был сам файл.
И тогда мы перебрать этого файла байт, потянув их все в один буфер
так что мы можем в конечном счете, распечатать их.
>> В самом деле, все эти называет здесь, чтобы dprintf
позволяет нам печатать что-то называется дескриптор файла, который
это просто целое число который представляет собой файл.
Очень близки по духу, но принципиально отличается от файла
звезда указатель.
Обратите внимание, как можно использовать синтаксис, как Printf здесь, так что я могу динамически
вставить что-то вроде длины для значения заголовка HTTP
называется Content-Length.
И в конечном счете я использовал Функция право на самом деле писать
тело запроса.
>> К сожалению, мы только реализованы поддержка для динамически
генерируемые PHP файлы.
Мы не реализовали поддержку статические файлы, такие как GIF-файлов, и в формате JPEG,
и CSS и HTML файлы.
Это, к сожалению, остается с вами в ответ на цели клиента
это делать.
Так там вы обнаружите, что есть не так много вдохновения внутри этого блока,
но если вы немного выше, как мы пошли о толковании PHP код,
функции, которые вы будете использовать немного отличается.
>> В самом деле, вы можете взять некоторые функции
возможно, из судебно-медицинской экспертизы Проблема набор, потому что
в конце концов, все что вам нужно сделать здесь когда-то вы знаете, что файл открыт
и как только вы знаете, что это так называется Тип MIME или тип содержимого,
Вы должны прочитать в этих байтах и как-то плевать их обратно.
>> А теперь тур это другие функции файла.
В первую очередь связано, который просто возвращает истину
когда он, наконец, слышит Соединение от пользователя.
Далее идет об ошибке.
Ошибка, тем временем, как функция, которую мы написал в обращении все различные 400
и статус 500 HTTP коды, которые вы можете
Чтобы отправить обратно пользователю, наряду со стандартным сообщением.
>> Далее идет нагрузка, особенно мясистые функция, цель которого в жизни
читать с файловой звезды указатель Содержимое файла в глобальном буфере
что мы объявлены глобально выше [? главный. ?]
Это довольно сложно, потому что мы должны прочитать байт из файла
но проверьте, на каждой итерации ли имею уже
попал в конец файла или еще что-то пошло не так.
И мы используем перераспределить, чтобы убедиться, что все буфера мы используем растет
и все растет и растет и всегда опережать число байтов,
что мы должны вписываться в там.
Хэндлер, тем временем, функция, которая получает
называется путем, имеющий зарегистрировано управления C в качестве сигнала
что мы хотим перехватить.
Обратите внимание, здесь, в обработчик что в конечном итоге и
вызовы остановки, что, конечно, останавливает веб-сервер.
И, к сожалению, поиск не реализован.
В духе, это довольно простая функция.
Учитывая расширение файла, он должен вернуться это так называемый MIME
тип или тип содержимого.
И мы указываем в описании что это отображение должно быть.
Но для этого нужно перевести это в конечном счете кода на C.
>> Затем наша аналогично мясистые функция называется разбора, которого цель в жизни
это читать, а не из файла, а от сетевого соединения.
В частности, чтение и анализ Запрос HTTP, который пришел из браузера
на сервере, так что в конечном счете, мы можем разобрать
всего в заголовках запроса линии и вернуться тех, к вам
путем глобального буфера, мы объявили выше [? главный. ?]
>> Сброс, тем временем, функция, которую мы определим
что вызывается многократно внутри основной каждый раз вы собираетесь
готовы, чтобы начать прослушивание Для нового соединения
так что мы всегда знаем, состояние наших переменных
и так, что мы также освободил любую память, которая
может быть выделено предыдущая подключение к сети.
Затем это начать, функция, которую мы написали
который содержит всю много сетевой код
что в конечном итоге начинает веб-сервер.
>> Последнее создадим функцию называется остановка, которая
делает именно то, что его останавливает веб-сервер.
Но сначала он освобождает всю память, что до сих пор было выделено.
Но в конечном итоге это вызывает выход даже не возвращая управление
к нашей основной функции.
В конечном счете, один из Важнейшими методы
При реализации этого веб-сервер будет немного проб и ошибок,
имея открытое окно одного браузера справа и окно терминала на
слева, консольные серверы окно, так что вы
можно увидеть сообщения, которые отображается на экране.
>> Но все-таки лучше было бы на треть Окно, второе окно терминала,
в которой вы используете Telnet, использование для которых предписано в спецификации.
И Telnet просто очень простая сетевая программа
что позволяет претендовать на быть браузер в одном окне
во время разговора в другое окно.
Таким образом, вы можете видеть ровно текстовые команды
что возвращаются от сервера к клиенту
без тыкать вокруг разработчика в Chrome
инструменты в противном случае clunkier интерфейс.