Reproduktor: teď pojďme skok do distribuční kódu a podívejte se na kontextu ve kterém je kód psaní se bude v provozu. Na konci dne, budete realizovat celistvost webového serveru. Ale my jsme za předpokladu, jste s kostrou Kód, který má některé funkce, zejména v souvislosti s sítí. Pojďme se podívat. Tak se zde směrem nahoru souboru je parta z funkce vyzkoušet makro požadavky. Teď je to jen vlastnost C, přičemž podle banda manuálových stránek musíte definovat některé Tyto konstanty aby to byla pravda nebo aby dokonce konkrétní čísla tak, aby máte přístup k některým funkcím. V opačném případě budete nehlášená a nebudete mít přístup. Tak jsem to udělal formou čtení manuálových stránek. Nyní dole, v řádky 15 až 17, jsme mají spoustu mezních hodnot deklarovaných. A my jsme si půjčil od nich populární web server s názvem Apache. A to jsou jen Čísla se děje že omezí celkový počet bajtů, které jsou povoleny v různých souvislostech pro HTTP požadavku že prohlížeč nemá mě poslat. Dále definujeme oktetů. Nyní oktet je jen ozdobný způsob, jak říkat byte, nebo osm bitů. Ukázalo se, že v minulosti byte Nebyly to nutně osm bitů, takže oktet je vždy osm bitů. Takže v tomto případě jsme se přijímají to, co je běžné v sítí Svět volá osm bytů oktet. Tady jsem si stanovila, že bude oktetů bylo 512, takže stejně jako v forenzní když čteme spoustu bytů v době, i zde, budeme číst banda oktetů najednou. Další spoustu hlavičkových souborů. Jak vím, že jsou tyto? Tak jsem prostě četl muže Stránky pro řadu funkcí že budeme používat v této distribuci kód a zařadit do těch Jsem byl instruován. A teď máme datový typ. My jsme deklarovali oktet za char. A uvidíme později, že je to používá v kódu. A my jsme deklaroval Celá parta prototypů, a my budeme chodit rychle procházet každé z těchto funkcí. Konečně, a možná nejvíce důležité, aby v mysl v tomto bodě příběh, je to tam jsou ve skutečnosti celá banda globálních proměnných v horní části souboru, kořen, CFD, SFD, dotaz, souborů a tělo. A teď obecně, s použitím tolik globální proměnné, nebo globální proměnné vůbec, není zpět praxe. Ale ukazuje se, že jsme i za použití technika nazývá zpracování signálů později v kódu, který nám umožňuje rozpoznat, kdy uživatel zasáhne něco jako CTRL C a vypnutí Server elegantně. A aby k tomu, že elegantně a skutečně uvolnit paměť, musíme mít přístup k Tyto globální proměnné. A teď pojďme se podívat na hlavní, což řídí celistvost tohoto programu. Za prvé, na vrcholu jsme tady mají chybu číslo proměnné která se nezdá mít typ, ale to je protože je to ve skutečnosti definované v souboru Chyba errno.h který je součástí výš. Pokud si člověk errno vlastně viz definice pro tuto věc, uvidíte, že to je speciální globální proměnná, která je stanovena celá parta funkcí nenapsal u nás, ale autoři Linuxu a jiné systémy se skutečně nastavit číslo této proměnné, když se něco pokazí, takže můžete po celém světě zjistit, co udělal pokazit. Nyní dole uvidíte nový Technika případně s využitím getopt, funkce, která pomáhá derivační příkaz řádku argumenty, takže děláme ne muset obtěžovat ztrácet čas přemýšlením na to, jak rozebrat něco jako 8080, nebo pomlčka p, nebo pomlčka h dostat pomoc. getopt v podstatě to pro nás dělá. Podívejte se na man stránku pro více. Dále děláme trochu chyb kontrola, aby se ujistil že číslo portu je v Uvedený dosah ve spec. Dále vidíme volání funkce start, jehož definice budeme podívejte se na v okamžiku, a jako jeho název navrhuje, se spustí webový server. Zde máme volání funkce volal signál, který říká, zda a kdy uslyšíte Control C z Klávesnice uživatele, jděte do toho a volání funkce s názvem popisovač, co se děje nakonec čisté věci a zastavení server. Pod ním je to, co se zdá být nekonečné smyčky, první řada, která účinně je výzva na funkci nazvanou reset, které jsme sami provést později za účelem uvolnit některé z našich globálních stavů. Poté, co je, že řada kód, který podmíněně kontroluje návrat Hodnota spojení. Nyní spojené vypadá jako predikát, něco, co se vrátí hodnotu true nebo false. A to dělá, ale je tu něco zvláštního v připojené v tom, že to je blokování hovorů. Bude tam sedět a čekat do prohlížeče uživatele se pokusí připojit k tomuto webu serveru a teprve pak to bude return true nebo false, takže budeme pokračovat na vnitřní straně tohoto if. Kdysi tam, všimněte si tuto funkci volání funkce parse, které jsme psali, který analyzuje všechny oktetů, vše z bytů pocházejících z prohlížeče na server, takže můžeme předat vám zpět nakonec hodnotu do jednoho z těch globálních proměnných, které ukládá všechny z bytů v právě Nadpisy, které požadavek, nikoli tělo v případě, že byl vlastně tělo na to. Teď dole začneme analyzovat ty hlavičky extrahovat podmnožina informací že nám záleží. Konkrétně na specifikace, nejprve chtěl požádat o linii, což je jen, že první řádek, který doufejme, že říká, že něco jako get lomítko nebo nějakou cestu a pak HTTP 1.1. Používáme tuto metaforu jehly v kupce sena hledat konkrétní znaky nebo adresy. A skutečně, je tu řada funkce v naší distribuční kódu Jste to vy, taky může být užitečné při hledání konkrétní hodnoty. Nakonec jsme zkopírujte tyto byty do proměnné s názvem linie, který si všimnout, také máme přidělené na zásobníku formou dynamicky dimenzován pole. A my jsme záměrně se snaží aby se zabránilo volání malloc protože znovu, protože of Control C bytí potenciál rysem tohoto programu, jsme se nechtějí mít tento kód najednou přerušil, když uživatel zmáčkne Ovládání C, jejímž výsledkem je to, že bych mohl nebude mít šanci zdarma něco, co jsem malloced. Takže jsem se snaží co nejvíce využít stohu je můžu tady. Další na řadě, spoustu DOS. Specifikace bude vykládat na přesně to, co se tu očekává, ale poznámky vám náznak toho, co je před námi. Nejprve musíte potvrdí žádost linku a ujistěte se, že to vypadá, jako specifikace gramatiky, abych tak řekl, říká, že by měl. Potom je třeba extrahovat něco volal dotaz, věci se Po otazníkem, jako jsme viděli na našem příkladě Google mimochodem v parametru HD. Pak jsme spojovat dohromady kořen webového serveru s cestou, která je v že žádost první řádek a tvoří úplnou cestu soubor chceme hledat. Poté, budeme se ujistil, že existuje soubor a je čitelný. A pak budeme extrahovat jeho přípona souboru, .html nebo php, nebo něco takového rozšíření, které je na velmi konec řetězce požadované. Další na řadě je celý banda kód, který jsme psali skutečně vytvářet PHP generovaný obsah pro vás. Stručně řečeno, tento Kód se v názvu souboru, který chcete PHP interpretovat. Míjíme ji něčím, co nazývají potrubí do interpretu PHP. Získejte zpět odpověď, jako by Reakce byly soubor sám. A pak jsme iteraci, že soubor je bajtů, tahání je všechny do jednoho bufferu takže můžeme nakonec vytisknout je. Ve skutečnosti, všechny z nich volá zde dprintf nám umožňuje něco vytisknout volal popisovač souboru, který je jen číslo který představuje soubor. Velmi podobné v duchu, ale zásadně liší od souboru hvězda ukazatel. Všimněte si, jak můžete použít syntaxi jako printf tady takže mohu dynamicky vložit něco jako délka pro hodnotu hlavičce HTTP volal Content-Length. A nakonec jsem použil funkce právo na skutečně psát orgán na žádost. Bohužel, jsme implementovali pouze Podpora pro dynamicky PHP generované soubory. Nechtěli jsme implementovat podporu pro statické soubory, jako je GIF a JPEG, a CSS a HTML soubory. To, bohužel, je ponecháno na vás v reakci na účelu klienta to dělat. Takže tam zjistíte, že tam je Není moc inspirace v tomto bloku, Ale pokud se něco výš na to, jak jsme šli o tlumočení PHP kód, funkce budete používat jsou trochu odlišné. Ve skutečnosti, můžete si půjčit některé funkce snad z forenzní Problém set, protože Na konci dne, vše, co potřebujete to tady je, až budete vědět, co otevřít soubor a když víte, že to tak-zvané Typ MIME nebo typ obsahu, budete muset přečíst v těchto bytech a nějak vyplivnout je zpátky. A teď prohlídka tohoto ostatní funkce souboru. Jako první je připojen, který jednoduše vrátí hodnotu true když už se konečně uslyší Spojení od uživatele. Další na řadě je chyba. Chyba, zatím, jak funkci, kterou napsal zvládnout všechny různé 400 a status 500 HTTP kódy, které budete chtít poslat zpět k uživateli, spolu se standardní zprávou. Další na řadě je zatížení, zvláště masitý funkce, jejichž smysl života se do čtení ze souboru hvězdy ukazatel Obsah souboru do globální paměti že jsme deklarovali globálně výše [? main. ?] To je trochu složité, protože my muset číst bajtů ze souboru ale podívejte se na každé iteraci zda máme již hit konec souboru nebo něco se pokazilo. A používáme realloc, aby se ujistil, že bez ohledu na vyrovnávací používáme roste a roste a roste a stále pobyt před počtu bytů že potřebujeme, aby se vešly tam. Handler, zatím, je funkce, která dostane volal prostřednictvím mít registrovaný Control C jako signál že chceme zachytit. Všimněte si, v procesu zpracování že to nakonec žádá zastavit, což samozřejmě zastaví webový server. A bohužel, vyhledávání není implementována. V duchu, to je poměrně jednoduché funkce. Vzhledem k tomu, příponu souboru, je třeba Pro návrat je to tzv MIME typu nebo typu obsahu. A my specifikovat ve specifikaci co musí být, že mapování. Ale potřebujete přeložit to nakonec c kód. Další na řadě je naše podobně vydatný funkce volal parse, jehož smysl života je číst, nikoliv ze souboru, ale ze sítě. Konkrétně, čtení a analýze Požadavek HTTP, které pocházejí z prohlížeče se tak, že na server nakonec můžeme analyzovat na pouhých záhlaví v žádosti linka a vrátit se k vám ty prostřednictvím globální vyrovnávací paměti, která jsme deklarovali výše [? main. ?] Obnovit, zatím, je funkce, kterou definujeme který se nazývá opakovaně uvnitř hlavní pokaždé, když se chystáte připraveni začít poslouchat pro nové připojení takže vždy víme, stav našich proměnných a tak, že máme také osvobodil jakékoliv paměť mohly být přiděleny pro předchozí připojení k síti. Další na řadě, je začít, funkce, kterou jsme napsali který obsahuje celou Hodně síťového kódu který nakonec spustí webový server. Poslední up je funkce volal zastávka, která dělá přesně to, ho zastaví webový server. Ale nejdřív to uvolní nějaké paměť je, že dosud bylo přiděleno. Ale nakonec volá exit i bez návratu kontroly na naši hlavní funkci. Nakonec, jeden z Nejdůležitější techniky Při provádění této web server Bude to trochu pokusů a omylů, mající jeden prohlížeče otevřené okno vpravo a okno terminálu na doleva, servery konzole okna, takže si je vidět zprávy, které jsou se zobrazuje na obrazovce. Ale pořád lepší by bylo třetiny okno, druhé okno terminálu, ve které budete používat Telnet, využití pro které je předepsáno v spec. A Telnet je jen velmi jednoduchý program síť který vám umožní předstírat, že být prohlížeč v jednom okně při rozhovoru na jiné okno. Tímto způsobem můžete vidět přesně příkazy textové které se vracejí ze serveru na klienta aniž by bylo nutné zamrznutí kolem Chrome vývojáře nástroje v jinak nejšílenější interface.