Kryetari: Tani le të pikiatë në kodin e shpërndarjes
dhe të marrë një vështrim në kontekstin në të cilën kodi që ju shkruani
do të jenë të veprojnë.
Në fund të ditës, ju jeni do të zbatojë
tërësia e web server.
Por ne kemi dhënë ju me skelet
Kodi që kanë disa funksionalitetin, veçanërisht të lidhura me krijimin e rrjeteve.
Le të marrin një sy.
>> Pra, deri këtu në drejtim të lartë i file është një bandë
e funksion të provuar kërkesat makro.
Tani kjo është vetëm një tipar i c, ku sipas një bandë e faqeve të njeriut
ju keni për të përcaktuar disa nga këto konstanta të jetë e vërtetë
ose të jenë edhe numrat të veçanta në mënyrë që ju keni qasje në disa funksione.
Përndryshe ata do të padeklaruar dhe ju nuk do të keni qasje.
Kështu që unë e kam bërë këtë me anë i lexuar faqet njeri.
Tani poshtë më poshtë, në Linjat e 15 përmes 17, ne
kanë një bandë e tërë e kufijve të deklaruara.
>> Dhe ne e kemi huazuar këto nga një web server popullor i quajtur Apache.
Dhe këto janë vetëm Numrat që do
për të kapak numrin e përgjithshëm e bytes që janë të lejuara
në kontekste të ndryshme për HTTP kërkesë se një shfletues është e lejuar për të dërguar mua.
Tjetra, ne define oktetin.
Tani një oktet është vetëm një mënyrë e sofistikuar i thënë se një bajt, ose tetë bit.
Rezulton në kaluar një byte ishte jo domosdoshmërisht tetë bit,
kështu oktet është gjithmonë tetë bit.
Pra në këtë rast ne kemi miratuar çfarë është e zakonshme në krijimin e rrjeteve
Bota e duke e quajtur tetë bytes një oktet.
>> Këtu unë e kam përcaktuar që do të Oktetet të jetë 512, kështu që shumë si në mjekësinë ligjore
kur lexojmë një bandë e bytes në një kohë, edhe këtu,
ne jemi duke shkuar për të lexuar një bandë e octets në një kohë.
Next një bandë e tërë e dosjeve header.
Si e di për të përfshirë këto?
E pra unë thjesht lexoj njeriun faqet për një numër të funksioneve
që ne do të përdorim në këtë shpërndarje Kodi dhe të përfshijë në ato
Unë kam qenë i udhëzuar për të.
>> Dhe tani ne kemi një lloj të dhënave.
Ne e kemi deklaruar një oktet të jetë një char.
Dhe ne do të shohim më vonë se kjo është përdoret gjatë gjithë kodit.
Dhe ne kemi deklaruar një e tërë bandë e prototypes,
dhe ne do të ecim shpejt përmes secili prej këtyre funksioneve.
Së fundi, dhe ndoshta më rëndësishme për të mbajtur në
mendje në këtë pikë në histori, është se nuk
janë, në fakt një e tërë bandë e variablave globale
në krye të file, rrënjë, CFD, SFD, kërkesë, fotografi dhe trup.
>> Tani në përgjithësi, duke përdorur në mënyrë shumë globale variabla, ose variabla globale në të gjitha,
nuk është praktikë përsëri.
Por kjo rezulton ne jemi gjithashtu duke përdorur një teknikë të quajtur trajtimin sinjal më vonë
në kodin, e cila na lejon për të zbuluar kur përdoruesit hits diçka
si CTRL C dhe mbyllur server gracefully.
Dhe në mënyrë që të bëjë atë gracefully dhe në të vërtetë të lirë deri kujtesës,
ne duhet të kenë qasje në këto variabla globale.
>> Dhe tani le të marrin një vështrim në kryesor, i cili drejton tërësinë e këtij programi.
Së pari, në krye këtu ne kanë një numër gabim variabël
që duket të mos kanë një lloj, por kjo është
sepse kjo është në të vërtetë përcaktuar në një file të quajtur
errno.h gabim që është përfshirë up më të lartë.
Nëse ju bëni njeriut errno për të vërtetë shih përkufizimin për këtë gjë,
ju do të shihni se kjo është një variabël të veçantë globale që
është vendosur nga një bandë e tërë e funksioneve jo i shkruar
nga ne, por nga autorët e Linux dhe sisteme të tjera për të vendosur në të vërtetë
një numër me atë të ndryshueshme kur diçka shkon keq në mënyrë që ju mund globalisht
kuptoj se çfarë e bëri të shkojnë keq.
>> Tani poshtë më poshtë ju do të shihni një të ri teknikë ndoshta duke përdorur getopt,
një funksion që ndihmon komandën parse Argumentet e linjës në mënyrë që ne të mos bëjmë
duhet të shqetësojë kohë që pakësoi numrin parafytyruar se si të bëj analizë gramatikore diçka si 8080,
ose dash p, ose dash h për të marrë ndihmë.
getopt në thelb bën që për ne.
Shih faqen njeri për më shumë.
>> Tjetra, ne bëjmë një grimë e gabimit duke kontrolluar për të siguruar
se numri i port është brenda varg specifikuar në spekulim.
Tjetra, ne shohim një thirrje të funksionit të fillojë, përkufizimi i të cilit ne do të
shikojmë në një moment, dhe si emrin e saj sugjeron, kjo fillon web server.
Këtu kemi një thirrje për një funksion i quajtur sinjal që thotë,
nëse dhe kur ju dëgjojnë Kontrollit C nga tastierë e përdoruesit, të shkojnë përpara dhe thirrje
një mbajtës funksion i quajtur që po ndodh gjëra për të në fund të fundit të pastruar dhe të ndaluar
server.
>> Më poshtë kjo është ajo që duket të jetë një loop pafund, vija e parë e cila
në mënyrë efektive është një thirrje në një funksion të quajtur
rivendosur, të cilat ne vetë zbatuar më pas në mënyrë
për të liruar disa prej shteteve tanë globale.
Pasi që është një linjë e Kodi që kushtimisht
është kontrolluar e kthimit Vlera e lidhur.
Duket tani të lidhura si një kallëzues, diçka që jep true ose false.
Dhe e bën atë, por ka diçka e veçantë në lidhur
në se kjo është një thirrje bllokuar.
Ajo do të ulem atje dhe presin deri shfletuesit të përdoruesit
përpiqet për të lidhur në këtë web server dhe vetëm atëherë do të ajo
kthehen vërtetë apo e rreme në mënyrë që ne të vazhdojë në brendësi të këtij nëse deklaratës.
>> Pasi atje, vëreni këtë funksion një funksion i quajtur Parse, që kemi shkruar,
cila parses gjitha octets, gjithë e bytes që vijnë nga një shfletues
në server, kështu që mund të dorës ju përsëri në fund të fundit një vlerë të njërit
e atyre variablave globale që dyqane të gjitha e bytes në vetëm
të headers e që kërkesë, jo trupi
nëse do të kishte në të vërtetë një organ për të.
>> Tani poshtë poshtë ne të fillojnë të bëj analizë gramatikore ato headers për nxjerrjen
një mesin e informacionit se kemi kujdes për.
Në mënyrë të veçantë, për specifikim, ne së pari
donte të kërkojë linjë, e cila është vetëm që vija e parë që
shpresojmë se thotë diçka si get çaj ose disa rrugë dhe pastaj HTTP 1.1.
Ne jemi duke përdorur këtë metaforë e një gjilpërë në kashtë
për të kërkuar të veçantë chars ose adresat.
Dhe me të vërtetë, ka një numër të funksionon në kodin tonë të shpërndarjes
se ju, gjithashtu, mund të gjeni të dobishme kur kërkoni për vlera të veçanta.
>> Në fund të fundit, ne të kopjoni këto bytes në një ndryshore të quajtur linjës,
që të vini re, gjithashtu, ne kemi ndarë në rafte
me anë të një grup me madhësi dinamike.
Dhe ne jemi duke u përpjekur qëllimisht për të shmangur thirrje malloc
sepse përsëri, sepse i Kontrollit C qenit
një tipar i mundshëm i këtij programi, ne nuk duan të kenë këtë kod papritmas
ndërprerë nga goditjet e përdoruesit Kontrolli C, rezultat i cili
është se unë nuk mund të ketë një shans për diçka të lirë unë kam malloced.
Kështu që unë jam duke u përpjekur për të përdorur sa më shumë i rafte është mundem këtu.
>> Next lart, një bandë e tërë e të DOS-it.
Specifikim do të shpjegoj më saktësisht se çfarë pritet këtu,
por komentet t'ju japë një aluzion i asaj që shtrihet përpara.
Ju së pari duhet të vërtetoni vijën kërkesën
dhe sigurohuni që ajo duket si Specifikimet e ciklit të lartë, kështu që të flasin,
thotë se duhet.
Ju pastaj duhet të nxjerrë diçka i quajtur query, sende jashtë
pas një pikëpyetje, si ne pamë me shembullin tonë të Google
në kalimin në një parametër HD.
Ne pastaj lidh së bashku rrënjë e web server
me rrugën që është në se kërkesa vija e parë
dhe formojnë rrugën e plotë të fotografi ne duam të shikoni për.
>> Pas kësaj, ne jemi duke shkuar për t'u siguruar se dosja ekziston dhe është i lexueshëm.
Dhe atëherë ne jemi duke shkuar për nxjerrjen e saj file extension, .html ose Php,
ose disa zgjerim i tillë që është në shumë fundi i vargut të kërkuar.
Next lart është një e tërë bandë e kodit kemi shkruar
që në fakt të gjeneruar PHP gjeneruar përmbajtje për ju.
Në pak fjalë, kjo Kodi i merr në emër
i file që dëshironi PHP për të interpretuar.
Ne të kalojë atë me diçka të quajtur një tub në përkthyes të PHP.
Marrë përsëri përgjigjen si edhe pse përgjigje ishin një skedë vetë.
Dhe pastaj ne iterate mbi atë dosje të bytes, duke tërhequr të gjithë në një tampon
kështu që ne mund të në fund të fundit printoni ato.
>> Në të vërtetë, të gjitha këto thërret këtu për të dprintf
na lejon për të shkruar diçka quajtur një përshkrues file, e cila
është vetëm një numër të plotë që paraqet një fotografi.
Shumë të ngjashme në frymë, por rrënjësisht i ndryshëm nga një fotografi
akrep yll.
Vini re se si ju mund të përdorni sintaksë si printf këtu kështu që unë mund dinamike
futur diçka si gjatësia për vlerën e një HTTP header
i quajtur Content-Length.
Dhe në fund të fundit unë e përdorur funksion të drejtë që në fakt shkruaj
trupi të kërkesës.
>> Për fat të keq, ne kemi zbatuar vetëm mbështetje për dinamike
gjeneruara fotografi PHP.
Ne nuk e zbatoi mbështetje për fotografi statike si gifs, dhe jpegs,
dhe CSS dhe HTML files.
Kjo, për fat të keq, është lënë për ju për t'iu përgjigjur qëllimit klientit
kjo për të bërë.
Pra, në atje ju do të gjeni se ka jo shumë frymëzim në atë bllok,
por në qoftë se ju pak më e lartë deri në sa shkuam për interpretimin kodin PHP,
funksionet që ju do të përdorni janë pak të ndryshme.
>> Në fakt, ju mund të huazoni disa nga funksionet
ndoshta nga mjekësinë ligjore set problem, sepse
në fund të ditës gjitha qe duhet te bëni këtu është një herë ju e dini çfarë të hapur skedar
dhe një herë ju e dini se është e ashtuquajtura Lloji MIME ose lloj të përmbajtjes,
ju duhet të lexoni në ato bytes dhe disi pështyjë ata përsëri jashtë.
>> Dhe tani një turne i kësaj Funksionet tjera të skedarit.
Up parë është e lidhur, që thjesht jep true
kur ai më në fund dëgjon një lidhje nga një përdorues.
Next lart është gabim.
Gabim, ndërkohë, si një funksion ne shkroi për të trajtuar të gjitha të 400 ndryshme
dhe 500 HTTP status Kodet që ju mund të dëshironi
për të dërguar përsëri për të përdoruesit, së bashku me një mesazh standarde.
>> Next lart është ngarkesë, një veçanërisht funksion prej mishi, qëllimi i të cilit në jetë
është për të lexuar nga një yll fotografi treguesin Përmbajtja e një dosje në një tampon globale
që ne deklaruar globalisht lart [? kryesor. ?]
Kjo është një kompleks pak, sepse ne kanë për të lexuar bytes nga file
por të kontrolloni në çdo ripërsëritje nëse ne kemi tashmë
goditi në fund të file ose diçka tjetër ka shkuar keq.
Dhe ne i përdorim risigurimi për të siguruar se çfarëdo tampon ne jeni duke përdorur është në rritje
dhe në rritje dhe në rritje dhe gjithmonë qëndruar përpara i numrit të bytes
që ne kemi nevojë të përshtaten në atje.
Handler, ndërkohë, është funksion që merr
quajtur anë të pasurit regjistruar Kontrollit C si një sinjal
që ne duam të ndërpres.
Vini re këtu në mbajtës se ai në fund të fundit
thirrje të ndaluar, e cila natyrisht ndalon web server.
Dhe për fat të keq, lookup nuk është zbatuar.
Në frymë, kjo është një funksion mjaft e thjeshtë.
Duke pasur parasysh një file extension, ajo ka nevojë për t'u kthyer është e ashtuquajtura MIME
lloji apo tipi i kënaqur.
Dhe ne të specifikojë në specifikimin çfarë duhet të jetë që hartës.
Por ju duhet për të përkthyer ajo në fund të fundit të kodit c.
>> Tjetra është funksioni ynë në mënyrë të ngjashme prej mishi i quajtur Parse, qëllimi i të cilit në jetë
është për të lexuar, jo nga një fotografi, por nga një lidhje të rrjetit.
Në mënyrë të veçantë, duke lexuar dhe parsing HTTP kërkesë që e ardhur nga një shfletues
në server në mënyrë që në fund të fundit mund të bëj analizë gramatikore
në vetëm headers në kërkesë line dhe të kthehen ato për ju
me anë të një zbutësi globale që ne deklaruar më lart [? kryesor. ?]
>> Reset, ndërkohë, është një funksion që ne define
që merr quajtur iteratively brenda i kryesor çdo kohë ju jeni gati
gati për të filluar duke dëgjuar për një lidhje të re
kështu që ne gjithmonë e di shtet i variablave tanë
dhe kështu që ne kemi edhe liruar ndonjë kujtim që
mund të ketë qenë ndarë për një lidhje e mëparshme rrjet.
Tjetra është të fillojë, funksion që kemi shkruar
që përmban një tërësi shumë i kodit networking
që në fund të fundit fillon web server.
>> Dalë i fundit është funksioni quajtur të ndaluar, e cila
bën pikërisht këtë, atë ndalon web server.
Por së pari ajo liron ndonjë kujtim që ende janë ndarë.
Por kjo në fund të fundit i quan dalje edhe pa e kthyer kontrollin
në funksion tonë kryesore.
Në fund të fundit, një nga Teknikat më të rëndësishme
kur zbatimin ky web server është do të jetë pak e gjykimit dhe gabim,
të paturit e një shfletuesit të hapura dritare në të drejtë dhe një dritare terminali në
la, servers konsol dritare, kështu që ju
mund të shihni mesazhet që janë të duke u shfaqur në ekran.
>> Por më mirë akoma do të ishte një e treta dritare, një dritare të dytë terminal,
në të cilat keni përdorur Telnet, përdorimin për të cilat është e përshkruar në spekulim.
Dhe Telnet është vetëm një shumë program i thjeshtë rrjet
që ju lejon të pretendojë të të jetë një shfletues në një dritare
ndërsa duke folur në dritare tjetër.
Në këtë mënyrë ju mund të shihni pikërisht komandat tekstuale
që po kthehen nga serveri tek klienti
pa pasur nevojë të poking rreth zhvilluesi krom-së
mjetet në një tjetër Ndërfaqja clunkier.