Előadó: Most merülés az elosztó kódot
és nézd meg, összefüggésben amelyben a kódot írsz
fog működni.
Végén a nap, fogsz végre
a teljes egészében a webszerver.
De már feltéve, Ön a csontváz
kód, amely valamilyen funkciót, különösen a kapcsolódó hálózatok.
Vessünk egy pillantást.
>> Tehát itt teteje felé A fájl egy rakás
A szolgáltatás tesztelése makro követelményeknek.
Most ez csak egy eleme a C, ahol szerint egy csomó embert oldalak
meg kell adnunk néhány ezek az állandók, hogy igaz legyen
vagy még konkrét számokat, hogy akkor a hozzáférést bizonyos funkciókhoz.
Ellenkező esetben akkor lesz a be nem jelentett és akkor nem férnek hozzá.
Ezért csináltam ezt a útján Az olvasó a man oldalakat.
Most lent, a vonalak 15 és 17, akkor
Van egy csomó korlátok nyilvánította.
>> És mi kölcsönzött ezeknek egy népszerű web szerver úgynevezett Apache.
És ezek csak számok mennek
tetejébe száma bájtok, amelyek jogosultak
különböző összefüggésekben a HTTP request A böngésző, küldhet nekem.
Ezután definiáljuk oktettnél.
Most egy oktett csak egy divatos módon A mondván egy byte, vagy nyolc bit.
Kiderült, hogy a múlt egy byte Nem feltétlenül nyolc bit,
így oktettben mindig nyolc bit.
Tehát ebben az esetben mi már elfogadott mi közös a hálózati
világába hív nyolc byte egy oktett.
>> Itt adtam meg, hogy oktettnél lesz 512, hogy ugyanúgy, mint a kriminalisztika
amikor azt olvassuk egy csomó byte-os, itt is,
fogunk olvasni a csomó oktett egy időben.
Next egy csomó header fájlokat.
Hogyan tudom, hogy ezeket a?
Hát én egyszerűen csak olvasni a férfi oldalakon számos funkciót
hogy fel fogjuk használni ebben az elosztó kódot, és tartalmazza azokat,
Azt az utasítást kapta, hogy.
>> És most van az adat típusát.
Már nyilvánították oktetben egy char.
És majd meglátjuk, hogy később ez használják szerte a kódot.
És mi már nyilvánították csomó prototípusok,
és megyünk keresztül gyorsan Minden ilyen funkciókat.
Végül, és talán a legtöbb Fontos, hogy a
bánja ezen a ponton a történet, hogy van
vannak, valójában egy egész csomó globális változók
a tetején a fájl, gyökér, CFD, SFD, kérésére, a fájl és a test.
>> Most általában, a sok globális változók, illetve globális változók egyáltalán,
nem a hátsó gyakorlat.
De kiderül, mi is egy nevű technológia jelkezelés később
a kódot, amely lehetővé teszi számunkra, hogy érzékeli, ha a felhasználó az valami
mint a CTRL C és állítsa le A kiszolgáló kecsesen.
És annak érdekében, hogy ezt, hogy kecsesen és valójában szabad memóriát,
mi szükség van hozzáférése ezek a globális változók.
>> És most vessünk egy pillantást a fő, amely hajtja a teljes egészében ezt a programot.
Először is, a tetején itt Van egy hiba száma változó
hogy a jelek szerint nem Van egy fajtája, de ez
mert valójában meghatározott nevű fájlt
error errno.h amely tartalmazza feljebb.
Ha ezt az ember hibakod ténylegesen definícióját lásd e dolog,
látni fogod, hogy ez egy speciális globális változó,
van beállítva egy csomó A funkciók nem írt
Az általunk, de a szerzők a Linux és más rendszerek állítása
Egy szám, amely a változó amikor valami elromlik, így globálisan
kitalálni, hogy mit csinált rosszul.
>> Most lent megjelenik egy új technika talán használ getopt,
olyan funkció, amely segít parse parancsot argumentumaiba, hogy mi nem
kell bajlódnia időhúzás kitalálni hogyan lehet feldolgozni valamit, mint 8080,
vagy kötőjel p, vagy gondolatjel h segítséget kérni.
getopt lényegében ezt teszi számunkra.
Lásd a man oldalt további.
>> Ezután teszünk egy kis hiba Ellenőrizzük, hogy
hogy a port száma belül A megadott tartományon a spec.
Ezután megjelenik egy függvény hívása kezdeni, amelyek definíciója fogunk
nézd meg egy pillanatra, és mint a neve sugallja, ez elindítja a webszervert.
Itt van egy hívás, hogy egy függvény nevezett jelet, amely azt mondja,
ha és amikor hallod kontroll C-re A felhasználó billentyűzet, megy előre, és hívja
olyan függvény is kezelőt, amely folyik hogy végül tisztán a dolgokat, és hagyja abba
a szerver.
>> Az alábbiakban ez az, amit úgy tűnik, hogy egy végtelen ciklusba, az első sorban, amely
hatékonyan egy hívást hogy olyan függvény is
visszaállítása, amelyet mi magunk végrehajtja a későbbiekben annak érdekében,
szabadítson fel a globális Államokban.
Ezután egy sor kód, amely feltételesen
ellenőrzi, a visszatérés értéke csatlakoztatott.
Most csatlakozik néz ki, mint egy állítmány, valamit, ami visszaadja igaz vagy hamis.
És igen, de van valami különleges csatlakoztatott
hogy ez egy blokkoló hívás.
Ez lesz ott ülni és várni amíg a felhasználó böngészőjének
megpróbál csatlakozni ehhez a web szerver és csak ezt követően lesz
vissza igaz vagy hamis, hogy mi járjunk a belsejében ez, ha a nyilatkozatot.
>> Egyszer ott, észre ezt a funkciót a nevű függvény értelmezési, amit írtam,
amely értelmezi az összes oktettre, minden A bájt érkező böngésző
a szerverre, hogy mi is kézzel vissza végül egy értéket egy
e globális változót tárolja a byte-ban csak
fejlécének, hogy kérést, nem a test
ha lenne valójában egy testet hozzá.
>> Most lent elkezdünk elemezni azokat a fejlécek kivonat
egy részhalmazát az információ hogy törődünk.
Pontosabban, egy a mellett, az első
akarta kérni vonal, amely a Csak, hogy az első sorban, hogy
remélhetőleg mond valamit, mint get perjel, vagy valami útnak, majd HTTP 1.1.
Mi ezzel a metafora Egy tűt a szénakazalban
keresni különösen karakter vagy címeket.
És valóban, van egy száma funkciók disztribúciós kódot
hogy te is hasznosnak bizonyulhatnak ha keres különösen értékeket.
>> Végső soron azt másolni ezeket a byte- egy változó nevű sort,
amely észre is volt, most már adható, a stack
útján egy dinamikusan méretű tömbben.
És mi szándékosan próbálják Kerülendő hívja malloc
mert újra, mert Ellenőrző C lenni
potenciális ennek a programnak, amit Nem akarom, hogy ezt a kódot hirtelen
a felhasználó által megszakítva ütő Kontroll C, melynek eredménye
az, hogy talán nem lesz esélye ingyen valamit, amit malloced.
Szóval próbálok a lehető legtöbb A verem tudok itt.
>> Következik, egy csomó, hogy dos.
A specifikáció fejti hogy pontosan mi várható itt,
de a hozzászólások kapsz egy csipetnyi mi vár ránk.
Először is ki kell érvényesíti a kérést vonalon
és győződjön meg róla, hogy úgy néz ki, mint a specifikációk nyelvtan, hogy úgy mondjam,
azt mondja, hogy kellene.
Ezután csomagold ki valamit nevű lekérdezés, a cucc
után egy kérdőjel, mint a láttuk a Google például
futólag egy HD paramétert.
Ezután összefűzni össze a gyökér a webkiszolgáló
A path ez a a kérésnek első sorban
és ezek képezik a teljes elérési útját A kívánt file keresni.
>> Ezt követően fogunk győződjön meg róla, hogy a fájl létezik és olvasható.
És akkor mi lesz kicsomagolni fájl kiterjesztését, a .html vagy a .php,
vagy valami hasonló kiterjesztése ez a Nagyon végén a szöveg kért.
Következik egy egész csomó kódot írtunk
hogy valóban létre PHP generált tartalom az Ön számára.
Dióhéjban ez a code veszi a nevét
A kívánt fájlt PHP értelmezni.
Elhaladunk azért valamivel úgynevezett a csövet a PHP interpreter.
Menj vissza a válasz, mintha A válasz volt egy fájlt magát.
És akkor mi végighaladni, hogy fájl bájt, húzza őket egy puffer
hogy így végső soron nyomtassa ki őket.
>> Valójában, az összes ilyen felszólítja ide dprintf
lehetővé teszi, hogy nyomtatni valamit nevű fájl leíró, amely
csak egy egész szám , ami egy fájl.
Nagyon hasonló szellemben, de alapvetően különbözik egy fájlt
csillagos pointer.
Figyeljük meg, hogyan lehet használni, mint a szintaxis printf itt, így én is dinamikusan
helyezze olyasmi, mint a hossza Az értéke egy HTTP fejléc
úgynevezett Content-Length.
És végül használtam funkciót jogot, hogy ténylegesen írni
A testület a kérést.
>> Sajnos csak végre támogatja a dinamikusan
generált PHP fájlokat.
Mi nem hajtotta végre támogatása statikus fájlokat, mint a gif, és JPEG,
és CSS és HTML fájlokat.
Hogy sajnos, marad meg hogy válaszoljon a kliens cél
ennek köze.
Szóval ott megtalálod, hogy van Nem sok inspirációt belül a blokk,
de ha egy kicsit feljebb, hogy milyen mentünk a tolmácsolási PHP kódot,
A funkciók fogsz használni egy kicsit más.
>> Sőt, lehet kölcsönözni néhány, a funkcionalitás
Talán a kriminalisztika problémát meg, mert
A nap végére csak annyit kell nem itt van, ha tudod, hogy mit fájlt megnyitni
és ha tudod, hogy az úgynevezett MIME-típus vagy a tartalom típusa,
el kell olvasni a bájtok és valahogy köpni őket vissza.
>> És most Ismerkedj meg az fájl egyéb funkciók.
Első csatlakozik, amely egyszerűen igazat ad vissza
amikor végre meghallja a kapcsolat egy felhasználótól.
Következik a hibát.
Hiba, eközben függvényében mi írta kezelni az összes különböző 400
és 500 HTTP státusz kódokat, hogy érdemes
küld vissza a felhasználónak, valamint egy szabványos üzenet.
>> Következik a terhelést, különösen húsos funkció, amelynek célja az életben
van, hogy olvasni egy fájlt csillagos mutató A A fájl tartalma egy globális buffer
hogy kijelentette világszerte a fenti [? fő. ?]
Ez egy kicsit bonyolultabb, mert kell olvasni a bájt fájl
de nézd meg az egyes iterációs hogy mi már
hit a végén a fájl vagy valami más baj van.
És az általunk használt realloc, hogy győződjön meg arról, hogy amit buffer mi használ növekszik
és egyre csak nőtt, és mindig tartózkodó előtt a bájtok számát
hogy meg kell, hogy beleférjen ott.
Handler, eközben A funkció, hogy lesz
nevű útján, amelynek bejegyzett kontroll C, mint egy jel
hogy szeretnénk, hogy elkapjam.
Figyeljük meg itt handler hogy végső soron
hívások megállítani, ami persze megáll a webszerver.
És sajnos, keresés nem hajtják végre.
Ebben szellem, ez egy meglehetősen egyszerű funkció.
Mivel a fájl kiterjesztését, szüksége vissza ez az úgynevezett MIME
típusú vagy a tartalom típusát.
És mi adja a specifikáció hogy mi mapping kell lennie.
De meg kell lefordítani Végső soron a c-kódot.
>> Következik a mi hasonlóan tartalmas funkció nevű parse, amelynek célja az életben
az, hogy olvasni, nem egy fájlból, de a hálózati kapcsolat.
Különösen, beolvasni és feldolgozni a HTTP kérés, hogy jött egy böngészőből
hogy a szerver, hogy végső soron tudjuk feldolgozni
éppen a fejlécét a kérelmet vonal és visszafordítására Önnek
útján egy globális puffert tartalmaz, amely azt a fenti nyilatkozat [? fő. ?]
>> Alaphelyzetbe, eközben egy funkciót, hogy mi határozza
hogy lesz úgynevezett iteratív belül A fő minden alkalommal fogsz
indulásra készen hallgat Egy új kapcsolat
így mindig tudjuk, az állam a mi változók
és így már azt is megszabadult minden memória
Lehet osztottak Egy korábbi hálózati kapcsolat.
A következő a sorban kezdeni, az funkció, amit írt
amely tartalmaz egy egész Sok hálózati kód
hogy végül elindítja a webszervert.
>> Utolsó akár a funkciót nevű megállója, amely
pontosan ezt teszi, akkor megáll a webszerver.
De előbb felszabadul egy olyan memória hogy még kiosztásra került.
De ez végül is kéri exit anélkül, hogy visszatér-szabályozás
a fő funkciója.
Végül, az egyik a legfontosabb technikák
végrehajtása során webszerver lesz egy kis próbálgatással,
amelynek egy böngésző ablakot nyitva A jobb oldalon és egy terminál ablakot
balra, a szerverek konzol ablakot, így
Láthatjuk az üzeneteket, amelyek jelenik meg a képernyőn.
>> De még jobb lenne egy harmadik ablak, a második terminál ablak,
amelyben a Telnet használatával, a használati amelyre írják a spec.
És Telnet csak egy nagyon egyszerű hálózati program
amely lehetővé teszi, hogy úgy tesznek, mintha egy böngészőt az egyik ablakban
beszélgetés közben a másik ablakba.
Így láthatjuk Pontosan a szöveges parancsok
hogy jönnek vissza a szervertől a kliensek
anélkül, hogy dugta körül Chrome fejlesztői
eszközöket az egyébként clunkier felület.