1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 Докладчик: Теперь давайте перейдем в код распределения 3 00:00:11,730 --> 00:00:14,470 и взглянуть на контекст в котором написанный вами код 4 00:00:14,470 --> 00:00:15,780 будет, будет функционировать. 5 00:00:15,780 --> 00:00:17,350 В конце концов, Вы собираетесь осуществить 6 00:00:17,350 --> 00:00:18,710 Совокупность веб-сервера. 7 00:00:18,710 --> 00:00:20,460 Но мы предоставили Вы со скелетом 8 00:00:20,460 --> 00:00:24,090 код, который есть некоторые функциональные возможности, особенно связанных с сетями. 9 00:00:24,090 --> 00:00:25,390 Давайте взглянем. 10 00:00:25,390 --> 00:00:27,560 >> Так здесь к вершине файла является связка 11 00:00:27,560 --> 00:00:30,020 из функции проверки макросов требованиям. 12 00:00:30,020 --> 00:00:33,570 Теперь это просто особенность С, в результате чего в соответствии с кучей искусственных страниц 13 00:00:33,570 --> 00:00:36,410 Вы должны определить некоторые Эти константы, чтобы быть правдой 14 00:00:36,410 --> 00:00:39,920 или быть даже конкретные цифры так, что у вас есть доступ к определенным функциям. 15 00:00:39,920 --> 00:00:42,470 В противном случае они будут Необъявленная и вы не будете иметь доступ. 16 00:00:42,470 --> 00:00:45,340 Так что я сделал это путем читать справочные страницы. 17 00:00:45,340 --> 00:00:48,410 Теперь внизу, в линии 15 через 17, мы 18 00:00:48,410 --> 00:00:50,550 есть целая куча ограничений, заявленных. 19 00:00:50,550 --> 00:00:53,370 >> И мы заимствовали их из популярный веб-сервер, называемый Apache. 20 00:00:53,370 --> 00:00:54,650 И это только Номера, которые собираются 21 00:00:54,650 --> 00:00:56,810 ограничить общее количество байтов, которые разрешены 22 00:00:56,810 --> 00:01:01,930 в различных контекстах для запроса HTTP что браузер может посылать меня. 23 00:01:01,930 --> 00:01:04,310 Далее, мы определяем октета. 24 00:01:04,310 --> 00:01:07,790 Теперь октет просто причудливый способ сказать байт, или восьми битов. 25 00:01:07,790 --> 00:01:10,720 Оказывается, в прошлых байт не обязательно было восемь бит, 26 00:01:10,720 --> 00:01:12,339 так октет всегда восемь бит. 27 00:01:12,339 --> 00:01:14,880 Таким образом, в этом случае мы приняли что общего в сети 28 00:01:14,880 --> 00:01:17,410 Мир называя восемь байт октета. 29 00:01:17,410 --> 00:01:21,840 >> Здесь я уточнил, что октета будет быть 512, так что так же, как в судебно-медицинской экспертизы 30 00:01:21,840 --> 00:01:24,170 когда мы читаем кучу байт в то время, и здесь, 31 00:01:24,170 --> 00:01:27,390 мы будем читать куча октетов в то время. 32 00:01:27,390 --> 00:01:28,922 Следующая целой кучей файлов заголовков. 33 00:01:28,922 --> 00:01:30,255 Как я знаю, включить их? 34 00:01:30,255 --> 00:01:32,730 Ну, я просто читать человека страниц для ряда функций 35 00:01:32,730 --> 00:01:35,620 что мы будем использовать в этом распределении код и включить в них 36 00:01:35,620 --> 00:01:37,390 Мне было поручено. 37 00:01:37,390 --> 00:01:39,090 >> И теперь у нас есть тип данных. 38 00:01:39,090 --> 00:01:41,470 Мы объявляем, что октет быть символ. 39 00:01:41,470 --> 00:01:44,040 И мы увидим позже, что это используемый в коде. 40 00:01:44,040 --> 00:01:45,670 И мы объявили целая куча прототипов, 41 00:01:45,670 --> 00:01:47,961 и мы быстро пройти через каждый из этих функций. 42 00:01:47,961 --> 00:01:50,400 Наконец, и, возможно, наиболее Важно иметь в 43 00:01:50,400 --> 00:01:52,520 ум в данный момент в история, является то, что 44 00:01:52,520 --> 00:01:54,520 , на самом деле вся куча глобальных переменных 45 00:01:54,520 --> 00:02:00,430 в верхней части файла, корень, CFD, ЮФО, просьба, файлов и тело. 46 00:02:00,430 --> 00:02:03,960 >> Теперь, как правило, с использованием так много глобальных переменные или глобальные переменные вообще, 47 00:02:03,960 --> 00:02:05,280 не вернулся практике. 48 00:02:05,280 --> 00:02:09,090 Но, оказывается, мы также используем метод, называемый обработка сигналов позже 49 00:02:09,090 --> 00:02:11,930 в коде, что позволяет нам определить, когда пользователь нажимает что-то 50 00:02:11,930 --> 00:02:15,080 как CTRL-C и закрыть Сервер изящно. 51 00:02:15,080 --> 00:02:18,240 А для того, чтобы сделать это изящно а на самом деле освободить память, 52 00:02:18,240 --> 00:02:20,800 мы должны иметь доступ к Эти глобальные переменные. 53 00:02:20,800 --> 00:02:24,510 >> А теперь давайте взглянем на-Майне, который диски полноту этой программы. 54 00:02:24,510 --> 00:02:27,720 Во-первых, в верхней здесь есть номер переменной ошибке 55 00:02:27,720 --> 00:02:29,570 что, кажется, не есть тип, но это 56 00:02:29,570 --> 00:02:31,500 потому что это на самом деле определены в файле под названием 57 00:02:31,500 --> 00:02:34,800 Ошибка errno.h, которые включен выше. 58 00:02:34,800 --> 00:02:38,780 Если вы человек ERRNO на самом деле определение см за это дело, 59 00:02:38,780 --> 00:02:41,230 Вы увидите, что это специальная глобальная переменная, которая 60 00:02:41,230 --> 00:02:43,350 устанавливается целый букет функций не написано 61 00:02:43,350 --> 00:02:48,730 нами, но авторы Linux и другие системы, чтобы фактически установить 62 00:02:48,730 --> 00:02:52,400 Количество этой переменной, когда что-то идет не так, так что вы можете во всем мире 63 00:02:52,400 --> 00:02:54,830 выяснить, что же идет не так. 64 00:02:54,830 --> 00:02:58,540 >> Теперь внизу вы увидите новый Техника возможно, с использованием Getopt, 65 00:02:58,540 --> 00:03:01,790 функция, которая помогает разбора команды аргументы командной строки, так что мы не 66 00:03:01,790 --> 00:03:05,540 придется беспокоиться бесполезной траты времени на выяснение как разобрать что-то вроде 8080, 67 00:03:05,540 --> 00:03:08,350 или тире р, или тире ч, чтобы получить помощь. 68 00:03:08,350 --> 00:03:10,300 Getopt по существу делает это за нас. 69 00:03:10,300 --> 00:03:11,750 Обратитесь к странице Справочника больше. 70 00:03:11,750 --> 00:03:13,960 >> Далее, мы делаем немного ошибок проверка, чтобы убедиться, 71 00:03:13,960 --> 00:03:17,420 что номер порта в пределах Указанный диапазон в спецификации. 72 00:03:17,420 --> 00:03:20,240 Далее, мы видим вызов функции начать, определение которого мы 73 00:03:20,240 --> 00:03:24,040 Посмотрите, в мгновение, и как его имя предлагает, это начинает веб-сервер. 74 00:03:24,040 --> 00:03:26,960 Здесь мы имеем вызов функции называется сигнал, который говорит, 75 00:03:26,960 --> 00:03:30,750 если и когда вы слышите управления С от Клавиатура пользователя, идти вперед и называть 76 00:03:30,750 --> 00:03:34,650 обработчик Функция называется, что происходит в конечном счете, чистые вещи и перестать 77 00:03:34,650 --> 00:03:35,500 сервер. 78 00:03:35,500 --> 00:03:39,470 >> Ниже это то, что, как представляется, бесконечный цикл, первая линия которого 79 00:03:39,470 --> 00:03:41,660 эффективно, это вызов для вызова функции 80 00:03:41,660 --> 00:03:45,110 сброс, который мы берем на себя осуществить позже в порядке 81 00:03:45,110 --> 00:03:47,470 чтобы освободить некоторые из наших глобальных состояний. 82 00:03:47,470 --> 00:03:50,480 После этого это линия код, который условно 83 00:03:50,480 --> 00:03:52,576 проверяет возвращение Значение связи. 84 00:03:52,576 --> 00:03:55,700 Теперь, связанные выглядит как предикат, то, что возвращает истину или ложь. 85 00:03:55,700 --> 00:03:58,040 И это делает, но есть что-то особенное в связи 86 00:03:58,040 --> 00:03:59,960 в том, что это вызывает блокировку. 87 00:03:59,960 --> 00:04:03,180 Он будет сидеть и ждать пока браузере пользователя 88 00:04:03,180 --> 00:04:05,860 пытается подключиться к этой сети сервер и только тогда она сможет 89 00:04:05,860 --> 00:04:10,160 вернуться истинным или ложным, так что мы исходим к внутренней этом, если заявление. 90 00:04:10,160 --> 00:04:13,870 >> Когда-то, заметьте, эту функцию Функция называется разбора, о котором мы писали, 91 00:04:13,870 --> 00:04:17,230 который анализирует все октетов, все байтов, поступающих из-браузер 92 00:04:17,230 --> 00:04:21,010 на сервере, так что мы можем передать Вы снова в конечном счете, значение одного 93 00:04:21,010 --> 00:04:24,420 из тех глобальных переменных, которые сохраняет все байт в просто 94 00:04:24,420 --> 00:04:26,630 заголовки, что запрос, а не тело 95 00:04:26,630 --> 00:04:28,920 если на самом деле было тело к нему. 96 00:04:28,920 --> 00:04:32,980 >> Теперь внизу мы начинаем разобрать эти заголовки, чтобы извлечь 97 00:04:32,980 --> 00:04:35,490 подмножество информации что мы заботимся о. 98 00:04:35,490 --> 00:04:37,740 В частности, в спецификация, мы сначала 99 00:04:37,740 --> 00:04:40,580 хотел просить линия, которая является Просто очень первая строка, которая 100 00:04:40,580 --> 00:04:45,710 мы надеемся, говорит что-то вроде Get сократить или какой-либо путь, а затем HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Мы используем эту метафору иглы в стоге сена 102 00:04:48,150 --> 00:04:50,370 искать частности символы или адреса. 103 00:04:50,370 --> 00:04:53,120 И в самом деле, есть ряд функции в нашем коде распределения 104 00:04:53,120 --> 00:04:56,930 что вы тоже могут оказаться полезными при поиске конкретных значений. 105 00:04:56,930 --> 00:05:00,630 >> В конечном счете, мы копируем эти байты в переменной с именем линии, 106 00:05:00,630 --> 00:05:03,510 которые заметили, слишком, мы в стеке 107 00:05:03,510 --> 00:05:05,890 путем динамического размера массива. 108 00:05:05,890 --> 00:05:08,350 И мы сознательно пытается чтобы избежать вызова таНос 109 00:05:08,350 --> 00:05:11,100 потому что снова, потому что из-под контроля C является 110 00:05:11,100 --> 00:05:14,630 Потенциал особенностью этой программы, мы не хотите, чтобы этот код вдруг 111 00:05:14,630 --> 00:05:17,479 прервано пользователем удара Контроль С, в результате которой 112 00:05:17,479 --> 00:05:20,270 является то, что я не мог есть шанс для свободного то я malloced. 113 00:05:20,270 --> 00:05:23,660 Так что я пытаюсь использовать так много стека, я можете здесь. 114 00:05:23,660 --> 00:05:26,040 >> Затем, целым букетом в DOS. 115 00:05:26,040 --> 00:05:28,930 Спецификация изложить на то, что ожидается здесь, 116 00:05:28,930 --> 00:05:31,800 но комментарии вам намек на то, что лежит впереди. 117 00:05:31,800 --> 00:05:33,830 Сначала вы должны проверить строку запроса 118 00:05:33,830 --> 00:05:37,760 и убедитесь, что она выглядит как Характеристики грамматики, так сказать, 119 00:05:37,760 --> 00:05:38,541 говорит, что надо. 120 00:05:38,541 --> 00:05:41,290 Затем нужно извлечь что-то называется запрос, вещество, из 121 00:05:41,290 --> 00:05:44,200 после вопросительного знака, как мы видели наш пример Google 122 00:05:44,200 --> 00:05:46,320 Попутно в параметре HD. 123 00:05:46,320 --> 00:05:49,050 Мы затем соедините вместе корень веб-сервера 124 00:05:49,050 --> 00:05:52,520 с пути, которая находится в что запрос на первой линии 125 00:05:52,520 --> 00:05:56,010 и образуют полный путь файл, который мы хотим искать. 126 00:05:56,010 --> 00:06:00,300 >> После этого, мы собираемся, чтобы убедиться, что файл существует и доступен для чтения. 127 00:06:00,300 --> 00:06:05,100 А потом мы собираемся извлечь его Расширение файла, .html или .php, 128 00:06:05,100 --> 00:06:09,920 или некоторые такие расширение, которое по крайней самый конец строки просил. 129 00:06:09,920 --> 00:06:11,940 Далее идет вся куча кода, который мы написали 130 00:06:11,940 --> 00:06:15,800 на самом деле генерировать PHP контент для вас. 131 00:06:15,800 --> 00:06:18,010 В двух словах, это код берет во имя 132 00:06:18,010 --> 00:06:20,250 файла, который вы хотите PHP для интерпретации. 133 00:06:20,250 --> 00:06:24,630 Мы проходим его, что называется труба в переводчика PHP. 134 00:06:24,630 --> 00:06:28,060 Получить обратно ответ, как будто Ответ был сам файл. 135 00:06:28,060 --> 00:06:32,110 И тогда мы перебрать этого файла байт, потянув их все в один буфер 136 00:06:32,110 --> 00:06:34,180 так что мы можем в конечном счете, распечатать их. 137 00:06:34,180 --> 00:06:37,230 >> В самом деле, все эти называет здесь, чтобы dprintf 138 00:06:37,230 --> 00:06:40,110 позволяет нам печатать что-то называется дескриптор файла, который 139 00:06:40,110 --> 00:06:42,350 это просто целое число который представляет собой файл. 140 00:06:42,350 --> 00:06:45,360 Очень близки по духу, но принципиально отличается от файла 141 00:06:45,360 --> 00:06:46,620 звезда указатель. 142 00:06:46,620 --> 00:06:50,260 Обратите внимание, как можно использовать синтаксис, как Printf здесь, так что я могу динамически 143 00:06:50,260 --> 00:06:54,000 вставить что-то вроде длины для значения заголовка HTTP 144 00:06:54,000 --> 00:06:55,270 называется Content-Length. 145 00:06:55,270 --> 00:06:57,990 И в конечном счете я использовал Функция право на самом деле писать 146 00:06:57,990 --> 00:07:00,040 тело запроса. 147 00:07:00,040 --> 00:07:03,750 >> К сожалению, мы только реализованы поддержка для динамически 148 00:07:03,750 --> 00:07:05,350 генерируемые PHP файлы. 149 00:07:05,350 --> 00:07:08,520 Мы не реализовали поддержку статические файлы, такие как GIF-файлов, и в формате JPEG, 150 00:07:08,520 --> 00:07:10,660 и CSS и HTML файлы. 151 00:07:10,660 --> 00:07:14,450 Это, к сожалению, остается с вами в ответ на цели клиента 152 00:07:14,450 --> 00:07:15,090 это делать. 153 00:07:15,090 --> 00:07:20,050 Так там вы обнаружите, что есть не так много вдохновения внутри этого блока, 154 00:07:20,050 --> 00:07:23,520 но если вы немного выше, как мы пошли о толковании PHP код, 155 00:07:23,520 --> 00:07:25,520 функции, которые вы будете использовать немного отличается. 156 00:07:25,520 --> 00:07:27,561 >> В самом деле, вы можете взять некоторые функции 157 00:07:27,561 --> 00:07:29,620 возможно, из судебно-медицинской экспертизы Проблема набор, потому что 158 00:07:29,620 --> 00:07:32,860 в конце концов, все что вам нужно сделать здесь когда-то вы знаете, что файл открыт 159 00:07:32,860 --> 00:07:35,690 и как только вы знаете, что это так называется Тип MIME или тип содержимого, 160 00:07:35,690 --> 00:07:39,040 Вы должны прочитать в этих байтах и как-то плевать их обратно. 161 00:07:39,040 --> 00:07:41,190 >> А теперь тур это другие функции файла. 162 00:07:41,190 --> 00:07:43,820 В первую очередь связано, который просто возвращает истину 163 00:07:43,820 --> 00:07:47,350 когда он, наконец, слышит Соединение от пользователя. 164 00:07:47,350 --> 00:07:48,786 Далее идет об ошибке. 165 00:07:48,786 --> 00:07:52,296 Ошибка, тем временем, как функция, которую мы написал в обращении все различные 400 166 00:07:52,296 --> 00:07:55,360 и статус 500 HTTP коды, которые вы можете 167 00:07:55,360 --> 00:07:58,500 Чтобы отправить обратно пользователю, наряду со стандартным сообщением. 168 00:07:58,500 --> 00:08:01,950 >> Далее идет нагрузка, особенно мясистые функция, цель которого в жизни 169 00:08:01,950 --> 00:08:06,920 читать с файловой звезды указатель Содержимое файла в глобальном буфере 170 00:08:06,920 --> 00:08:09,000 что мы объявлены глобально выше [? главный. ?] 171 00:08:09,000 --> 00:08:12,649 Это довольно сложно, потому что мы должны прочитать байт из файла 172 00:08:12,649 --> 00:08:14,690 но проверьте, на каждой итерации ли имею уже 173 00:08:14,690 --> 00:08:17,600 попал в конец файла или еще что-то пошло не так. 174 00:08:17,600 --> 00:08:21,210 И мы используем перераспределить, чтобы убедиться, что все буфера мы используем растет 175 00:08:21,210 --> 00:08:24,440 и все растет и растет и всегда опережать число байтов, 176 00:08:24,440 --> 00:08:25,675 что мы должны вписываться в там. 177 00:08:25,675 --> 00:08:27,550 Хэндлер, тем временем, функция, которая получает 178 00:08:27,550 --> 00:08:30,630 называется путем, имеющий зарегистрировано управления C в качестве сигнала 179 00:08:30,630 --> 00:08:32,140 что мы хотим перехватить. 180 00:08:32,140 --> 00:08:34,070 Обратите внимание, здесь, в обработчик что в конечном итоге и 181 00:08:34,070 --> 00:08:36,780 вызовы остановки, что, конечно, останавливает веб-сервер. 182 00:08:36,780 --> 00:08:39,750 И, к сожалению, поиск не реализован. 183 00:08:39,750 --> 00:08:41,940 В духе, это довольно простая функция. 184 00:08:41,940 --> 00:08:44,900 Учитывая расширение файла, он должен вернуться это так называемый MIME 185 00:08:44,900 --> 00:08:46,320 тип или тип содержимого. 186 00:08:46,320 --> 00:08:49,260 И мы указываем в описании что это отображение должно быть. 187 00:08:49,260 --> 00:08:52,330 Но для этого нужно перевести это в конечном счете кода на C. 188 00:08:52,330 --> 00:08:56,490 >> Затем наша аналогично мясистые функция называется разбора, которого цель в жизни 189 00:08:56,490 --> 00:08:59,350 это читать, а не из файла, а от сетевого соединения. 190 00:08:59,350 --> 00:09:03,510 В частности, чтение и анализ Запрос HTTP, который пришел из браузера 191 00:09:03,510 --> 00:09:05,940 на сервере, так что в конечном счете, мы можем разобрать 192 00:09:05,940 --> 00:09:09,530 всего в заголовках запроса линии и вернуться тех, к вам 193 00:09:09,530 --> 00:09:12,720 путем глобального буфера, мы объявили выше [? главный. ?] 194 00:09:12,720 --> 00:09:14,880 >> Сброс, тем временем, функция, которую мы определим 195 00:09:14,880 --> 00:09:18,730 что вызывается многократно внутри основной каждый раз вы собираетесь 196 00:09:18,730 --> 00:09:20,799 готовы, чтобы начать прослушивание Для нового соединения 197 00:09:20,799 --> 00:09:22,840 так что мы всегда знаем, состояние наших переменных 198 00:09:22,840 --> 00:09:24,870 и так, что мы также освободил любую память, которая 199 00:09:24,870 --> 00:09:28,070 может быть выделено предыдущая подключение к сети. 200 00:09:28,070 --> 00:09:30,060 Затем это начать, функция, которую мы написали 201 00:09:30,060 --> 00:09:31,920 который содержит всю много сетевой код 202 00:09:31,920 --> 00:09:34,420 что в конечном итоге начинает веб-сервер. 203 00:09:34,420 --> 00:09:36,680 >> Последнее создадим функцию называется остановка, которая 204 00:09:36,680 --> 00:09:38,770 делает именно то, что его останавливает веб-сервер. 205 00:09:38,770 --> 00:09:42,270 Но сначала он освобождает всю память, что до сих пор было выделено. 206 00:09:42,270 --> 00:09:45,850 Но в конечном итоге это вызывает выход даже не возвращая управление 207 00:09:45,850 --> 00:09:47,480 к нашей основной функции. 208 00:09:47,480 --> 00:09:49,480 В конечном счете, один из Важнейшими методы 209 00:09:49,480 --> 00:09:52,680 При реализации этого веб-сервер будет немного проб и ошибок, 210 00:09:52,680 --> 00:09:55,886 имея открытое окно одного браузера справа и окно терминала на 211 00:09:55,886 --> 00:09:57,760 слева, консольные серверы окно, так что вы 212 00:09:57,760 --> 00:10:00,420 можно увидеть сообщения, которые отображается на экране. 213 00:10:00,420 --> 00:10:04,170 >> Но все-таки лучше было бы на треть Окно, второе окно терминала, 214 00:10:04,170 --> 00:10:07,135 в которой вы используете Telnet, использование для которых предписано в спецификации. 215 00:10:07,135 --> 00:10:09,640 И Telnet просто очень простая сетевая программа 216 00:10:09,640 --> 00:10:12,660 что позволяет претендовать на быть браузер в одном окне 217 00:10:12,660 --> 00:10:14,540 во время разговора в другое окно. 218 00:10:14,540 --> 00:10:16,830 Таким образом, вы можете видеть ровно текстовые команды 219 00:10:16,830 --> 00:10:18,700 что возвращаются от сервера к клиенту 220 00:10:18,700 --> 00:10:20,810 без тыкать вокруг разработчика в Chrome 221 00:10:20,810 --> 00:10:24,010 инструменты в противном случае clunkier интерфейс. 222 00:10:24,010 --> 00:10:29,099