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.