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.