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 Сега това е само функция на C, при което според един куп човека страници 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, SFD, искане, файл и тялото. 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 ако и когато чуете Control C от клавиатура на потребителя, давай напред и да се обадя 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 защото отново, тъй на Control 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 Забележете как можете да използвате синтаксис като ФОРМАТ тук, така че аз може динамично 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 Handler, междувременно, е функцията, която получава 178 00:08:27,550 --> 00:08:30,630 призова чрез имащ регистрирано Control 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 >> Reset, междувременно, е функция, която ние определяме 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