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.