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 >> И ми смо позајмили ово из популаран веб сервер зове Апацхе. 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 у различитим контекстима за ХТТП захтева да претраживач је дозвољено да ме пошаље. 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 на врху датотеке, корен, ЦФД, СФД, захтев, датотека и тело. 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 као ЦТРЛ Ц и угасити сервера грациозно. 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 Грешка еррно.х који је укључена уз ланац. 58 00:02:34,800 --> 00:02:38,780 Уколико човек еррно да заправо види дефиницију за ову ствар, 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 код нас, али аутори Линук и друге системе да заправо сет 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 >> Сада доле испод видећете нови техника можда користећи гетопт, 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 гетопт суштини то ради за нас. 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 надамо се каже нешто попут гет сласх или неки пут и онда ХТТП 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 јер поново, јер Контрола на Ц је 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 је да нисам можда има шансу фор фрее нешто сам маллоцед. 113 00:05:20,270 --> 00:05:23,660 Дакле, ја покушавам да користе што више стека је што могу. 114 00:05:23,660 --> 00:05:26,040 >> Следеће, гомила на дос. 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 после знаком питања, као видели смо са нашим Гоогле пример 122 00:05:44,200 --> 00:05:46,320 у пролазу у ХД параметар. 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 А онда ћемо извући његов филе ектенсион, .хтмл или .пхп, 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 да заправо генерише ПХП садржаје за вас. 131 00:06:15,800 --> 00:06:18,010 У суштини, ово цоде узима у име 132 00:06:18,010 --> 00:06:20,250 датотеке желите ПХП да тумаче. 133 00:06:20,250 --> 00:06:24,630 Ми га пролазе нешто што се зове цев у ПХП-преводиоца. 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 >> Заиста, све то позива овде да дпринтф 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 убаците нешто као дужини за вредности ХТТП хеадер 144 00:06:54,000 --> 00:06:55,270 зове Цонтент-Типе. 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 генерисани ПХП датотеке. 149 00:07:05,350 --> 00:07:08,520 Нисмо имплементирати подршку за статички фајлови ГИФ-ова, и ЈПЕГ-ови, 150 00:07:08,520 --> 00:07:10,660 и ЦСС и ХТМЛ датотеке. 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 али ако вас мало више горе у колико ишли смо о тумачењу ПХП код, 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 и када знате да је такозвана МИМЕ тип или тип садржаја, 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 ХТТП статус кодови да бисте можда желели 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 позвао путем имајући регистрован Цонтрол Ц као сигнал 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 С обзиром филе ектенсион, потребно да се врате то тзв МИМЕ 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 Али морате да преведете то на крају да ц кодом. 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 Конкретно, читање и рашчлањивање ХТТП захтев да је дошао из претраживача 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 у којој користите Телнет, коришћење за које је прописана у спец. 215 00:10:07,135 --> 00:10:09,640 И Телнет је само веома једноставан програм мрежа 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 без боде око програмера Цхроме- 221 00:10:20,810 --> 00:10:24,010 алати у иначе цлункиер интерфејс. 222 00:10:24,010 --> 00:10:29,099