1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 Reproduktor: teď pojďme skok do distribuční kódu 3 00:00:11,730 --> 00:00:14,470 a podívejte se na kontextu ve kterém je kód psaní 4 00:00:14,470 --> 00:00:15,780 se bude v provozu. 5 00:00:15,780 --> 00:00:17,350 Na konci dne, budete realizovat 6 00:00:17,350 --> 00:00:18,710 celistvost webového serveru. 7 00:00:18,710 --> 00:00:20,460 Ale my jsme za předpokladu, jste s kostrou 8 00:00:20,460 --> 00:00:24,090 Kód, který má některé funkce, zejména v souvislosti s sítí. 9 00:00:24,090 --> 00:00:25,390 Pojďme se podívat. 10 00:00:25,390 --> 00:00:27,560 >> Tak se zde směrem nahoru souboru je parta 11 00:00:27,560 --> 00:00:30,020 z funkce vyzkoušet makro požadavky. 12 00:00:30,020 --> 00:00:33,570 Teď je to jen vlastnost C, přičemž podle banda manuálových stránek 13 00:00:33,570 --> 00:00:36,410 musíte definovat některé Tyto konstanty aby to byla pravda 14 00:00:36,410 --> 00:00:39,920 nebo aby dokonce konkrétní čísla tak, aby máte přístup k některým funkcím. 15 00:00:39,920 --> 00:00:42,470 V opačném případě budete nehlášená a nebudete mít přístup. 16 00:00:42,470 --> 00:00:45,340 Tak jsem to udělal formou čtení manuálových stránek. 17 00:00:45,340 --> 00:00:48,410 Nyní dole, v řádky 15 až 17, jsme 18 00:00:48,410 --> 00:00:50,550 mají spoustu mezních hodnot deklarovaných. 19 00:00:50,550 --> 00:00:53,370 >> A my jsme si půjčil od nich populární web server s názvem Apache. 20 00:00:53,370 --> 00:00:54,650 A to jsou jen Čísla se děje 21 00:00:54,650 --> 00:00:56,810 že omezí celkový počet bajtů, které jsou povoleny 22 00:00:56,810 --> 00:01:01,930 v různých souvislostech pro HTTP požadavku že prohlížeč nemá mě poslat. 23 00:01:01,930 --> 00:01:04,310 Dále definujeme oktetů. 24 00:01:04,310 --> 00:01:07,790 Nyní oktet je jen ozdobný způsob, jak říkat byte, nebo osm bitů. 25 00:01:07,790 --> 00:01:10,720 Ukázalo se, že v minulosti byte Nebyly to nutně osm bitů, 26 00:01:10,720 --> 00:01:12,339 takže oktet je vždy osm bitů. 27 00:01:12,339 --> 00:01:14,880 Takže v tomto případě jsme se přijímají to, co je běžné v sítí 28 00:01:14,880 --> 00:01:17,410 Svět volá osm bytů oktet. 29 00:01:17,410 --> 00:01:21,840 >> Tady jsem si stanovila, že bude oktetů bylo 512, takže stejně jako v forenzní 30 00:01:21,840 --> 00:01:24,170 když čteme spoustu bytů v době, i zde, 31 00:01:24,170 --> 00:01:27,390 budeme číst banda oktetů najednou. 32 00:01:27,390 --> 00:01:28,922 Další spoustu hlavičkových souborů. 33 00:01:28,922 --> 00:01:30,255 Jak vím, že jsou tyto? 34 00:01:30,255 --> 00:01:32,730 Tak jsem prostě četl muže Stránky pro řadu funkcí 35 00:01:32,730 --> 00:01:35,620 že budeme používat v této distribuci kód a zařadit do těch 36 00:01:35,620 --> 00:01:37,390 Jsem byl instruován. 37 00:01:37,390 --> 00:01:39,090 >> A teď máme datový typ. 38 00:01:39,090 --> 00:01:41,470 My jsme deklarovali oktet za char. 39 00:01:41,470 --> 00:01:44,040 A uvidíme později, že je to používá v kódu. 40 00:01:44,040 --> 00:01:45,670 A my jsme deklaroval Celá parta prototypů, 41 00:01:45,670 --> 00:01:47,961 a my budeme chodit rychle procházet každé z těchto funkcí. 42 00:01:47,961 --> 00:01:50,400 Konečně, a možná nejvíce důležité, aby v 43 00:01:50,400 --> 00:01:52,520 mysl v tomto bodě příběh, je to tam 44 00:01:52,520 --> 00:01:54,520 jsou ve skutečnosti celá banda globálních proměnných 45 00:01:54,520 --> 00:02:00,430 v horní části souboru, kořen, CFD, SFD, dotaz, souborů a tělo. 46 00:02:00,430 --> 00:02:03,960 >> A teď obecně, s použitím tolik globální proměnné, nebo globální proměnné vůbec, 47 00:02:03,960 --> 00:02:05,280 není zpět praxe. 48 00:02:05,280 --> 00:02:09,090 Ale ukazuje se, že jsme i za použití technika nazývá zpracování signálů později 49 00:02:09,090 --> 00:02:11,930 v kódu, který nám umožňuje rozpoznat, kdy uživatel zasáhne něco 50 00:02:11,930 --> 00:02:15,080 jako CTRL C a vypnutí Server elegantně. 51 00:02:15,080 --> 00:02:18,240 A aby k tomu, že elegantně a skutečně uvolnit paměť, 52 00:02:18,240 --> 00:02:20,800 musíme mít přístup k Tyto globální proměnné. 53 00:02:20,800 --> 00:02:24,510 >> A teď pojďme se podívat na hlavní, což řídí celistvost tohoto programu. 54 00:02:24,510 --> 00:02:27,720 Za prvé, na vrcholu jsme tady mají chybu číslo proměnné 55 00:02:27,720 --> 00:02:29,570 která se nezdá mít typ, ale to je 56 00:02:29,570 --> 00:02:31,500 protože je to ve skutečnosti definované v souboru 57 00:02:31,500 --> 00:02:34,800 Chyba errno.h který je součástí výš. 58 00:02:34,800 --> 00:02:38,780 Pokud si člověk errno vlastně viz definice pro tuto věc, 59 00:02:38,780 --> 00:02:41,230 uvidíte, že to je speciální globální proměnná, která 60 00:02:41,230 --> 00:02:43,350 je stanovena celá parta funkcí nenapsal 61 00:02:43,350 --> 00:02:48,730 u nás, ale autoři Linuxu a jiné systémy se skutečně nastavit 62 00:02:48,730 --> 00:02:52,400 číslo této proměnné, když se něco pokazí, takže můžete po celém světě 63 00:02:52,400 --> 00:02:54,830 zjistit, co udělal pokazit. 64 00:02:54,830 --> 00:02:58,540 >> Nyní dole uvidíte nový Technika případně s využitím getopt, 65 00:02:58,540 --> 00:03:01,790 funkce, která pomáhá derivační příkaz řádku argumenty, takže děláme ne 66 00:03:01,790 --> 00:03:05,540 muset obtěžovat ztrácet čas přemýšlením na to, jak rozebrat něco jako 8080, 67 00:03:05,540 --> 00:03:08,350 nebo pomlčka p, nebo pomlčka h dostat pomoc. 68 00:03:08,350 --> 00:03:10,300 getopt v podstatě to pro nás dělá. 69 00:03:10,300 --> 00:03:11,750 Podívejte se na man stránku pro více. 70 00:03:11,750 --> 00:03:13,960 >> Dále děláme trochu chyb kontrola, aby se ujistil 71 00:03:13,960 --> 00:03:17,420 že číslo portu je v Uvedený dosah ve spec. 72 00:03:17,420 --> 00:03:20,240 Dále vidíme volání funkce start, jehož definice budeme 73 00:03:20,240 --> 00:03:24,040 podívejte se na v okamžiku, a jako jeho název navrhuje, se spustí webový server. 74 00:03:24,040 --> 00:03:26,960 Zde máme volání funkce volal signál, který říká, 75 00:03:26,960 --> 00:03:30,750 zda a kdy uslyšíte Control C z Klávesnice uživatele, jděte do toho a volání 76 00:03:30,750 --> 00:03:34,650 funkce s názvem popisovač, co se děje nakonec čisté věci a zastavení 77 00:03:34,650 --> 00:03:35,500 server. 78 00:03:35,500 --> 00:03:39,470 >> Pod ním je to, co se zdá být nekonečné smyčky, první řada, která 79 00:03:39,470 --> 00:03:41,660 účinně je výzva na funkci nazvanou 80 00:03:41,660 --> 00:03:45,110 reset, které jsme sami provést později za účelem 81 00:03:45,110 --> 00:03:47,470 uvolnit některé z našich globálních stavů. 82 00:03:47,470 --> 00:03:50,480 Poté, co je, že řada kód, který podmíněně 83 00:03:50,480 --> 00:03:52,576 kontroluje návrat Hodnota spojení. 84 00:03:52,576 --> 00:03:55,700 Nyní spojené vypadá jako predikát, něco, co se vrátí hodnotu true nebo false. 85 00:03:55,700 --> 00:03:58,040 A to dělá, ale je tu něco zvláštního v připojené 86 00:03:58,040 --> 00:03:59,960 v tom, že to je blokování hovorů. 87 00:03:59,960 --> 00:04:03,180 Bude tam sedět a čekat do prohlížeče uživatele 88 00:04:03,180 --> 00:04:05,860 se pokusí připojit k tomuto webu serveru a teprve pak to bude 89 00:04:05,860 --> 00:04:10,160 return true nebo false, takže budeme pokračovat na vnitřní straně tohoto if. 90 00:04:10,160 --> 00:04:13,870 >> Kdysi tam, všimněte si tuto funkci volání funkce parse, které jsme psali, 91 00:04:13,870 --> 00:04:17,230 který analyzuje všechny oktetů, vše z bytů pocházejících z prohlížeče 92 00:04:17,230 --> 00:04:21,010 na server, takže můžeme předat vám zpět nakonec hodnotu do jednoho 93 00:04:21,010 --> 00:04:24,420 z těch globálních proměnných, které ukládá všechny z bytů v právě 94 00:04:24,420 --> 00:04:26,630 Nadpisy, které požadavek, nikoli tělo 95 00:04:26,630 --> 00:04:28,920 v případě, že byl vlastně tělo na to. 96 00:04:28,920 --> 00:04:32,980 >> Teď dole začneme analyzovat ty hlavičky extrahovat 97 00:04:32,980 --> 00:04:35,490 podmnožina informací že nám záleží. 98 00:04:35,490 --> 00:04:37,740 Konkrétně na specifikace, nejprve 99 00:04:37,740 --> 00:04:40,580 chtěl požádat o linii, což je jen, že první řádek, který 100 00:04:40,580 --> 00:04:45,710 doufejme, že říká, že něco jako get lomítko nebo nějakou cestu a pak HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Používáme tuto metaforu jehly v kupce sena 102 00:04:48,150 --> 00:04:50,370 hledat konkrétní znaky nebo adresy. 103 00:04:50,370 --> 00:04:53,120 A skutečně, je tu řada funkce v naší distribuční kódu 104 00:04:53,120 --> 00:04:56,930 Jste to vy, taky může být užitečné při hledání konkrétní hodnoty. 105 00:04:56,930 --> 00:05:00,630 >> Nakonec jsme zkopírujte tyto byty do proměnné s názvem linie, 106 00:05:00,630 --> 00:05:03,510 který si všimnout, také máme přidělené na zásobníku 107 00:05:03,510 --> 00:05:05,890 formou dynamicky dimenzován pole. 108 00:05:05,890 --> 00:05:08,350 A my jsme záměrně se snaží aby se zabránilo volání malloc 109 00:05:08,350 --> 00:05:11,100 protože znovu, protože of Control C bytí 110 00:05:11,100 --> 00:05:14,630 potenciál rysem tohoto programu, jsme se nechtějí mít tento kód najednou 111 00:05:14,630 --> 00:05:17,479 přerušil, když uživatel zmáčkne Ovládání C, jejímž výsledkem 112 00:05:17,479 --> 00:05:20,270 je to, že bych mohl nebude mít šanci zdarma něco, co jsem malloced. 113 00:05:20,270 --> 00:05:23,660 Takže jsem se snaží co nejvíce využít stohu je můžu tady. 114 00:05:23,660 --> 00:05:26,040 >> Další na řadě, spoustu DOS. 115 00:05:26,040 --> 00:05:28,930 Specifikace bude vykládat na přesně to, co se tu očekává, 116 00:05:28,930 --> 00:05:31,800 ale poznámky vám náznak toho, co je před námi. 117 00:05:31,800 --> 00:05:33,830 Nejprve musíte potvrdí žádost linku 118 00:05:33,830 --> 00:05:37,760 a ujistěte se, že to vypadá, jako specifikace gramatiky, abych tak řekl, 119 00:05:37,760 --> 00:05:38,541 říká, že by měl. 120 00:05:38,541 --> 00:05:41,290 Potom je třeba extrahovat něco volal dotaz, věci se 121 00:05:41,290 --> 00:05:44,200 Po otazníkem, jako jsme viděli na našem příkladě Google 122 00:05:44,200 --> 00:05:46,320 mimochodem v parametru HD. 123 00:05:46,320 --> 00:05:49,050 Pak jsme spojovat dohromady kořen webového serveru 124 00:05:49,050 --> 00:05:52,520 s cestou, která je v že žádost první řádek 125 00:05:52,520 --> 00:05:56,010 a tvoří úplnou cestu soubor chceme hledat. 126 00:05:56,010 --> 00:06:00,300 >> Poté, budeme se ujistil, že existuje soubor a je čitelný. 127 00:06:00,300 --> 00:06:05,100 A pak budeme extrahovat jeho přípona souboru, .html nebo php, 128 00:06:05,100 --> 00:06:09,920 nebo něco takového rozšíření, které je na velmi konec řetězce požadované. 129 00:06:09,920 --> 00:06:11,940 Další na řadě je celý banda kód, který jsme psali 130 00:06:11,940 --> 00:06:15,800 skutečně vytvářet PHP generovaný obsah pro vás. 131 00:06:15,800 --> 00:06:18,010 Stručně řečeno, tento Kód se v názvu 132 00:06:18,010 --> 00:06:20,250 souboru, který chcete PHP interpretovat. 133 00:06:20,250 --> 00:06:24,630 Míjíme ji něčím, co nazývají potrubí do interpretu PHP. 134 00:06:24,630 --> 00:06:28,060 Získejte zpět odpověď, jako by Reakce byly soubor sám. 135 00:06:28,060 --> 00:06:32,110 A pak jsme iteraci, že soubor je bajtů, tahání je všechny do jednoho bufferu 136 00:06:32,110 --> 00:06:34,180 takže můžeme nakonec vytisknout je. 137 00:06:34,180 --> 00:06:37,230 >> Ve skutečnosti, všechny z nich volá zde dprintf 138 00:06:37,230 --> 00:06:40,110 nám umožňuje něco vytisknout volal popisovač souboru, který 139 00:06:40,110 --> 00:06:42,350 je jen číslo který představuje soubor. 140 00:06:42,350 --> 00:06:45,360 Velmi podobné v duchu, ale zásadně liší od souboru 141 00:06:45,360 --> 00:06:46,620 hvězda ukazatel. 142 00:06:46,620 --> 00:06:50,260 Všimněte si, jak můžete použít syntaxi jako printf tady takže mohu dynamicky 143 00:06:50,260 --> 00:06:54,000 vložit něco jako délka pro hodnotu hlavičce HTTP 144 00:06:54,000 --> 00:06:55,270 volal Content-Length. 145 00:06:55,270 --> 00:06:57,990 A nakonec jsem použil funkce právo na skutečně psát 146 00:06:57,990 --> 00:07:00,040 orgán na žádost. 147 00:07:00,040 --> 00:07:03,750 >> Bohužel, jsme implementovali pouze Podpora pro dynamicky 148 00:07:03,750 --> 00:07:05,350 PHP generované soubory. 149 00:07:05,350 --> 00:07:08,520 Nechtěli jsme implementovat podporu pro statické soubory, jako je GIF a JPEG, 150 00:07:08,520 --> 00:07:10,660 a CSS a HTML soubory. 151 00:07:10,660 --> 00:07:14,450 To, bohužel, je ponecháno na vás v reakci na účelu klienta 152 00:07:14,450 --> 00:07:15,090 to dělat. 153 00:07:15,090 --> 00:07:20,050 Takže tam zjistíte, že tam je Není moc inspirace v tomto bloku, 154 00:07:20,050 --> 00:07:23,520 Ale pokud se něco výš na to, jak jsme šli o tlumočení PHP kód, 155 00:07:23,520 --> 00:07:25,520 funkce budete používat jsou trochu odlišné. 156 00:07:25,520 --> 00:07:27,561 >> Ve skutečnosti, můžete si půjčit některé funkce 157 00:07:27,561 --> 00:07:29,620 snad z forenzní Problém set, protože 158 00:07:29,620 --> 00:07:32,860 Na konci dne, vše, co potřebujete to tady je, až budete vědět, co otevřít soubor 159 00:07:32,860 --> 00:07:35,690 a když víte, že to tak-zvané Typ MIME nebo typ obsahu, 160 00:07:35,690 --> 00:07:39,040 budete muset přečíst v těchto bytech a nějak vyplivnout je zpátky. 161 00:07:39,040 --> 00:07:41,190 >> A teď prohlídka tohoto ostatní funkce souboru. 162 00:07:41,190 --> 00:07:43,820 Jako první je připojen, který jednoduše vrátí hodnotu true 163 00:07:43,820 --> 00:07:47,350 když už se konečně uslyší Spojení od uživatele. 164 00:07:47,350 --> 00:07:48,786 Další na řadě je chyba. 165 00:07:48,786 --> 00:07:52,296 Chyba, zatím, jak funkci, kterou napsal zvládnout všechny různé 400 166 00:07:52,296 --> 00:07:55,360 a status 500 HTTP kódy, které budete chtít 167 00:07:55,360 --> 00:07:58,500 poslat zpět k uživateli, spolu se standardní zprávou. 168 00:07:58,500 --> 00:08:01,950 >> Další na řadě je zatížení, zvláště masitý funkce, jejichž smysl života 169 00:08:01,950 --> 00:08:06,920 se do čtení ze souboru hvězdy ukazatel Obsah souboru do globální paměti 170 00:08:06,920 --> 00:08:09,000 že jsme deklarovali globálně výše [? main. ?] 171 00:08:09,000 --> 00:08:12,649 To je trochu složité, protože my muset číst bajtů ze souboru 172 00:08:12,649 --> 00:08:14,690 ale podívejte se na každé iteraci zda máme již 173 00:08:14,690 --> 00:08:17,600 hit konec souboru nebo něco se pokazilo. 174 00:08:17,600 --> 00:08:21,210 A používáme realloc, aby se ujistil, že bez ohledu na vyrovnávací používáme roste 175 00:08:21,210 --> 00:08:24,440 a roste a roste a stále pobyt před počtu bytů 176 00:08:24,440 --> 00:08:25,675 že potřebujeme, aby se vešly tam. 177 00:08:25,675 --> 00:08:27,550 Handler, zatím, je funkce, která dostane 178 00:08:27,550 --> 00:08:30,630 volal prostřednictvím mít registrovaný Control C jako signál 179 00:08:30,630 --> 00:08:32,140 že chceme zachytit. 180 00:08:32,140 --> 00:08:34,070 Všimněte si, v procesu zpracování že to nakonec 181 00:08:34,070 --> 00:08:36,780 žádá zastavit, což samozřejmě zastaví webový server. 182 00:08:36,780 --> 00:08:39,750 A bohužel, vyhledávání není implementována. 183 00:08:39,750 --> 00:08:41,940 V duchu, to je poměrně jednoduché funkce. 184 00:08:41,940 --> 00:08:44,900 Vzhledem k tomu, příponu souboru, je třeba Pro návrat je to tzv MIME 185 00:08:44,900 --> 00:08:46,320 typu nebo typu obsahu. 186 00:08:46,320 --> 00:08:49,260 A my specifikovat ve specifikaci co musí být, že mapování. 187 00:08:49,260 --> 00:08:52,330 Ale potřebujete přeložit to nakonec c kód. 188 00:08:52,330 --> 00:08:56,490 >> Další na řadě je naše podobně vydatný funkce volal parse, jehož smysl života 189 00:08:56,490 --> 00:08:59,350 je číst, nikoliv ze souboru, ale ze sítě. 190 00:08:59,350 --> 00:09:03,510 Konkrétně, čtení a analýze Požadavek HTTP, které pocházejí z prohlížeče 191 00:09:03,510 --> 00:09:05,940 se tak, že na server nakonec můžeme analyzovat 192 00:09:05,940 --> 00:09:09,530 na pouhých záhlaví v žádosti linka a vrátit se k vám ty 193 00:09:09,530 --> 00:09:12,720 prostřednictvím globální vyrovnávací paměti, která jsme deklarovali výše [? main. ?] 194 00:09:12,720 --> 00:09:14,880 >> Obnovit, zatím, je funkce, kterou definujeme 195 00:09:14,880 --> 00:09:18,730 který se nazývá opakovaně uvnitř hlavní pokaždé, když se chystáte 196 00:09:18,730 --> 00:09:20,799 připraveni začít poslouchat pro nové připojení 197 00:09:20,799 --> 00:09:22,840 takže vždy víme, stav našich proměnných 198 00:09:22,840 --> 00:09:24,870 a tak, že máme také osvobodil jakékoliv paměť 199 00:09:24,870 --> 00:09:28,070 mohly být přiděleny pro předchozí připojení k síti. 200 00:09:28,070 --> 00:09:30,060 Další na řadě, je začít, funkce, kterou jsme napsali 201 00:09:30,060 --> 00:09:31,920 který obsahuje celou Hodně síťového kódu 202 00:09:31,920 --> 00:09:34,420 který nakonec spustí webový server. 203 00:09:34,420 --> 00:09:36,680 >> Poslední up je funkce volal zastávka, která 204 00:09:36,680 --> 00:09:38,770 dělá přesně to, ho zastaví webový server. 205 00:09:38,770 --> 00:09:42,270 Ale nejdřív to uvolní nějaké paměť je, že dosud bylo přiděleno. 206 00:09:42,270 --> 00:09:45,850 Ale nakonec volá exit i bez návratu kontroly 207 00:09:45,850 --> 00:09:47,480 na naši hlavní funkci. 208 00:09:47,480 --> 00:09:49,480 Nakonec, jeden z Nejdůležitější techniky 209 00:09:49,480 --> 00:09:52,680 Při provádění této web server Bude to trochu pokusů a omylů, 210 00:09:52,680 --> 00:09:55,886 mající jeden prohlížeče otevřené okno vpravo a okno terminálu na 211 00:09:55,886 --> 00:09:57,760 doleva, servery konzole okna, takže si 212 00:09:57,760 --> 00:10:00,420 je vidět zprávy, které jsou se zobrazuje na obrazovce. 213 00:10:00,420 --> 00:10:04,170 >> Ale pořád lepší by bylo třetiny okno, druhé okno terminálu, 214 00:10:04,170 --> 00:10:07,135 ve které budete používat Telnet, využití pro které je předepsáno v spec. 215 00:10:07,135 --> 00:10:09,640 A Telnet je jen velmi jednoduchý program síť 216 00:10:09,640 --> 00:10:12,660 který vám umožní předstírat, že být prohlížeč v jednom okně 217 00:10:12,660 --> 00:10:14,540 při rozhovoru na jiné okno. 218 00:10:14,540 --> 00:10:16,830 Tímto způsobem můžete vidět přesně příkazy textové 219 00:10:16,830 --> 00:10:18,700 které se vracejí ze serveru na klienta 220 00:10:18,700 --> 00:10:20,810 aniž by bylo nutné zamrznutí kolem Chrome vývojáře 221 00:10:20,810 --> 00:10:24,010 nástroje v jinak nejšílenější interface. 222 00:10:24,010 --> 00:10:29,099