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