Reproduktor: teraz poďme skok do distribučnej kódu a pozrite sa na kontexte v ktorom je kód písanie sa bude v prevádzke. Na konci dňa, budete realizovať celistvosť webového servera. Ale my sme za predpokladu, ste s kostrou Kód, ktorý má niektoré funkcie, najmä v súvislosti s sietí. Poďme sa pozrieť. Tak sa tu smerom nahor súboru je partia z funkcie vyskúšať makro požiadavky. Teraz je to len vlastnosť C, pričom podľa banda manuálových stránok musíte definovať niektoré Tieto konštanty aby to bola pravda alebo aby dokonca konkrétne čísla tak, aby máte prístup k niektorým funkciám. V opačnom prípade budete nelegálna a nebudete mať prístup. Tak som to urobil formou čítanie manuálových stránok. Teraz dole, v riadky 15 až 17, sme majú veľa limitných hodnôt deklarovaných. A my sme si požičal od nich populárne web server s názvom Apache. A to sú len Čísla sa deje že obmedzí celkový počet bajtov, ktoré sú povolené v rôznych súvislostiach pre HTTP požiadavky že prehliadač nemá ma poslať. Ďalej definujeme oktetov. Teraz oktet je len ozdobný spôsob, ako hovoriť byte, alebo osem bitov. Ukázalo sa, že v minulosti byte Neboli to nutne osem bitov, takže oktet je vždy osem bitov. Takže v tomto prípade sme sa prijímajú to, čo je bežné v sietí Svet volá osem bytov oktet. Tu som si stanovila, že bude oktetov bolo 512, takže rovnako ako v forenznú keď čítame veľa bytov v dobe, aj tu, budeme čítať banda oktetov naraz. Ďalšie veľa hlavičkových súborov. Ako viem, že sú tieto? Tak som proste čítal muža Stránky pre rad funkcií že budeme používať v tejto distribúcii kód a zaradiť do tých Som bol inštruovaný. A teraz máme dátový typ. My sme deklarovali oktet za char. A uvidíme neskôr, že je to používa v kóde. A my sme deklaroval Celá partia prototypov, a my budeme chodiť rýchlo prechádzať každej z týchto funkcií. Konečne, a možno najviac dôležité, aby v myseľ v tomto bode príbeh, je to tam sú v skutočnosti celá banda globálnych premenných v hornej časti súboru, koreň, CFD, SFD, otázka, súborov a telo. A teraz všeobecne, s použitím toľko globálnej premenné, alebo globálne premenné vôbec, nie je späť prax. Ale ukazuje sa, že sme aj za použitia technika nazýva spracovanie signálov neskôr v kóde, ktorý nám umožňuje rozpoznať, kedy užívateľ zasiahne niečo ako CTRL C a vypnutie Server elegantne. A aby k tomu, že elegantne a skutočne uvoľniť pamäť, musíme mať prístup k Tieto globálne premenné. A teraz poďme sa pozrieť na hlavné, čo riadi celistvosť tohto programu. Po prvé, na vrchole sme tu majú chybu číslo premenné ktorá sa nezdá mať typ, ale to je pretože je to v skutočnosti definované v súbore Chyba errno.h ktorý je súčasťou vyššie. Ak si človek errno vlastne pozri definície pre túto vec, uvidíte, že to je špeciálna globálna premenná, ktorá je stanovená celá partia funkcií nenapísal u nás, ale autori Linuxe a iné systémy sa skutočne nastaviť číslo tejto premennej, keď sa niečo pokazí, takže môžete po celom svete zistiť, čo urobil pokaziť. Teraz dole uvidíte nový Technika prípadne s využitím getopt, funkcia, ktorá pomáha derivačný príkaz riadku argumenty, takže robíme nie musieť obťažovať strácať čas premýšľaním na to, ako rozobrať niečo ako 8080, alebo pomlčka p, alebo pomlčka h dostať pomoc. getopt v podstate to pre nás robí. Pozrite sa na man stránku pre viac. Ďalej robíme trochu chýb kontrola, aby sa ubezpečil že číslo portu je v Uvedený dosah vo špec. Ďalej vidíme volanie funkcie štart, ktorého definícia budeme pozrite sa na v okamihu, a ako jeho názov navrhuje, sa spustí webový server. Tu máme volanie funkcie volal signál, ktorý hovorí, či a kedy začujete Control C z Klávesnica užívateľa, choďte do toho a volanie funkcia s názvom popisovač, čo sa deje nakoniec čisté veci a zastavenie server. Pod ním je to, čo sa zdá byť nekonečnej slučky, prvý rad, ktorá účinne je výzva na funkciu nazvanú reset, ktoré sme sami vykonať neskôr za účelom uvoľniť niektoré z našich globálnych stavov. Potom, čo je, že rad kód, ktorý podmienečne kontroluje návrat Hodnota spojenia. Teraz spojené vyzerá ako predikát, niečo, čo sa vráti hodnotu true alebo false. A to robí, ale je tu niečo zvláštneho v pripojenej v tom, že to je blokovanie hovorov. Bude tam sedieť a čakať do prehliadača užívateľa sa pokúsi pripojiť k tomuto webu servera a až potom to bude return true alebo false, takže budeme pokračovať na vnútornej strane tohto if. Kedysi tam, všimnite si túto funkciu volanie funkcie parse, ktoré sme písali, ktorý analyzuje všetky oktetov, všetko z bytov pochádzajúcich z prehliadača na server, takže môžeme odovzdať vám späť nakoniec hodnotu do jedného z tých globálnych premenných, ktoré ukladá všetky z bytov v práve Nadpisy, ktoré požiadavka, nie telo v prípade, že bol vlastne telo na to. Teraz dole začneme analyzovať tie hlavičky extrahovať podmnožina informácií že nám záleží. Konkrétne na špecifikácie, najprv chcel požiadať o líniu, čo je len, že prvý riadok, ktorý dúfajme, že hovorí, že niečo ako get lomka alebo nejakú cestu a potom HTTP 1.1. Používame túto metaforu ihly v kope sena hľadať konkrétne znaky alebo adresy. A skutočne, je tu rad funkcie v našej distribučnej kóde Ste to vy, taky môže byť užitočné pri hľadaní konkrétnej hodnoty. Nakoniec sme skopírujte tieto byty do premennej s názvom línie, ktorý si všimnúť, tiež máme pridelené na zásobníku formou dynamicky dimenzovaný poľa. A my sme zámerne sa snaží aby sa zabránilo volania malloc pretože znova, pretože of Control C bytia potenciál črtou tohto programu, sme sa nechcú mať tento kód naraz prerušil, keď užívateľ stlačí Ovládanie C, ktorej výsledkom je to, že by som mohol nebude mať šancu zadarmo niečo, čo som malloced. Takže som sa snaží čo najviac využiť stohu je môžem tu. Ďalší na rade, veľa DOS. Špecifikácia bude vykladať na presne to, čo sa tu očakáva, ale poznámky vám náznak toho, čo je pred nami. Najprv musíte potvrdí žiadosť linku a uistite sa, že to vyzerá, ako špecifikácie gramatiky, aby som tak povedal, hovorí, že by mal. Potom je potrebné extrahovať niečo volal dotaz, veci sa Po otáznikom, ako sme videli na našom príklade Google mimochodom v parametri HD. Potom sme spájať dohromady koreň webového servera s cestou, ktorá je v že žiadosť prvý riadok a tvorí úplnú cestu súbor chceme hľadať. Potom, budeme sa ubezpečil, že existuje súbor a je čitateľný. A potom budeme extrahovať jeho prípona súboru, .html alebo php, alebo niečo také rozšírenie, ktoré je na veľmi koniec reťazca požadované. Ďalšia na rade je celý banda kód, ktorý sme písali skutočne vytvárať PHP generovaný obsah pre vás. Stručne povedané, tento Kód sa v názve súboru, ktorý chcete PHP interpretovať. Míňame ju niečím, čo nazývajú potrubia do interpretu PHP. Získajte späť odpoveď, ako by Reakcie boli súbor sám. A potom sme iterácii, že súbor je bajtov, ťahanie ich všetky do jedného buffera takže môžeme nakoniec vytlačiť ich. V skutočnosti, všetky z nich volá tu dprintf nám umožňuje niečo vytlačiť volal popisovač súboru, ktorý je len číslo ktorý predstavuje súbor. Veľmi podobné v duchu, ale zásadne líši od súboru hviezda ukazovateľ. Všimnite si, ako môžete použiť syntax ako printf tu takže môžem dynamicky vložiť niečo ako dĺžka pre hodnotu hlavičke HTTP volal Content-Length. A nakoniec som použil funkcie právo na skutočne písať orgán na žiadosť. Bohužiaľ, sme implementovali iba Podpora pre dynamicky PHP generované súbory. Nechceli sme implementovať podporu pre statické súbory, ako je GIF a JPEG, a CSS a HTML súbory. To, bohužiaľ, je ponechané na vás v reakcii na účel klienta to robiť. Takže tam zistíte, že tam je Nie je moc inšpirácie v tomto bloku, Ale ak sa niečo vyššie na to, ako sme išli o tlmočenie PHP kód, funkcie budete používať sú trochu odlišné. V skutočnosti, môžete si požičať niektoré funkcie snáď z forenznej Problém set, pretože Na konci dňa, všetko, čo potrebujete to tu je, až budete vedieť, čo otvoriť súbor a keď viete, že to tak-zvané Typ MIME alebo typ obsahu, budete musieť prečítať v týchto bytoch a nejako vypľuť je späť. A teraz prehliadka tohto ostatné funkcie súboru. Ako prvý je pripojený, ktorý jednoducho vráti hodnotu true keď už sa konečne začuje Spojenie od užívateľa. Ďalšia na rade je chyba. Chyba, zatiaľ, ako funkciu, ktorú napísal zvládnuť všetky rôzne 400 a status 500 HTTP kódy, ktoré budete chcieť poslať späť k užívateľovi, spolu so štandardnou správou. Ďalšia na rade je zaťaženie, zvlášť mäsitý funkcie, ktorých zmysel života sa do čítania zo súboru hviezdy ukazovateľ Obsah súboru do globálnej pamäti že sme deklarovali globálne vyššie [? main. ?] To je trochu zložité, pretože my musieť čítať bajtov zo súboru ale pozrite sa na každej iterácii či máme už hit koniec súboru alebo niečo sa pokazilo. A používame realloc, aby sa ubezpečil, že bez ohľadu na vyrovnávacej používame rastie a rastie a rastie a stále pobyt pred počtu bytov že potrebujeme, aby sa zmestili tam. Handler, zatiaľ, je funkcia, ktorá dostane volal prostredníctvom mať registrovaný Control C ako signál že chceme zachytiť. Všimnite si, v procese spracovania že to nakoniec žiada zastaviť, čo samozrejme zastaví webový server. A bohužiaľ, vyhľadávanie nie je implementovaná. V duchu, to je pomerne jednoduché funkcie. Vzhľadom k tomu, príponu súboru, je potrebné Pre návrat je to tzv MIME typu alebo typu obsahu. A my špecifikovať v špecifikácii čo musí byť, že mapovanie. Ale potrebujete preložiť to nakoniec c kód. Ďalšia na rade je naša podobne výdatný funkcie volal parse, ktorého zmysel života je čítať, nie zo súboru, ale zo siete. Konkrétne, čítanie a analýze Požiadavka HTTP, ktoré pochádzajú z prehliadača sa tak, že na server nakoniec môžeme analyzovať na iba hlavičky v žiadosti linka a vrátiť sa k vám tie prostredníctvom globálnej vyrovnávacej pamäte, ktorá sme deklarovali vyššie [? main. ?] Obnoviť, zatiaľ, je funkcie, ktorú definujeme ktorý sa nazýva opakovane vnútri hlavné zakaždým, keď sa chystáte pripravení začať počúvať pre nové pripojenie takže vždy vieme, stav našich premenných a tak, že máme tiež oslobodil akékoľvek pamäť mohli byť pridelené na predchádzajúce pripojenie k sieti. Ďalšie na rade, je začať, funkcie, ktorú sme napísali ktorý obsahuje celú Veľa sieťového kódu ktorý nakoniec spustí webový server. Posledná up je funkcia volal zastávka, ktorá robí presne to, ho zastaví webový server. Ale najprv to uvoľní nejaké pamäť je, že doteraz bolo pridelené. Ale nakoniec volá exit aj bez návratu kontroly na našu hlavnú funkciu. Nakoniec, jeden z Najdôležitejšie techniky Pri vykonávaní tejto web server Bude to trochu pokusov a omylov, majúci jeden prehliadača otvorené okno vpravo a okno terminálu na doľava, servery konzoly okná, takže si je vidieť správy, ktoré sú sa zobrazuje na obrazovke. Ale stále lepšie by bolo tretiny okno, druhé okno terminálu, v ktorej budete používať Telnet, využitie pre ktoré je predpísané v špec. A Telnet je len veľmi jednoduchý program sieť ktorý vám umožní predstierať, že byť prehliadač v jednom okne pri rozhovore na iné okno. Týmto spôsobom môžete vidieť presne príkazy textové ktoré sa vracajú zo servera na klienta aby bolo nutné zamrznutiu okolo Chrome vývojárov nástroje v inak najšialenejšie interface.