SPEAKER: Issa ejja adsa fil-kodiċi ta 'distribuzzjoni u tagħti ħarsa lejn il-kuntest li fiha l-kodiċi tikteb se jkun qed jopera. Fl-aħħar tal-ġurnata, int ser jimplimentaw l-intier ta 'l-web server. Imma aħna għandna sakemm inti ma 'l-iskeletru kodiċi li jkollhom xi funzjonalità, partikolarment relatati mal-netwerking. Ejja tagħti ħarsa. Allura up here lejn il-quċċata tal-fajl huwa mazz karatteristika test rekwiżiti makro. Issa din hija biss karatteristika ta 'c, fejn skond il-mazz ta 'paġni bniedem ikollok biex jiddefinixxu xi wħud dawn kostanti biex ikunu vera jew li jkun saħansitra numri speċifiċi hekk li ikollok aċċess għal ċerti funzjonijiet. Inkella dawn ser ikunu mhux iddikjarat u int mhux se jkollhom aċċess. So I ghamilt dan permezz tal-qari tal-paġni bniedem. Issa stabbiliti hawn taħt, Linji 15 permezz 17, aħna jkollhom mazz sħiħ ta 'limiti ddikjarati. U aħna ħadthom mislufa dawn minn web server popolari imsejħa Apache. U dawn huma biss numri li huma għaddejjin li għatu l-għadd totali ta 'bytes li huma permessi f'diversi kuntesti għat-talba HTTP li browser huwa permess li tibgħatli. Sussegwentement, aħna jiddefinixxu octets. Issa l-ottett huwa biss mod fancy ta 'tgħid byte, jew tmien bits. Jinstabx fi yesteryear f'byte ma kienx qed neċessarjament tmienja bits, hekk ottett huwa dejjem tmien bits. Allura f'dan il-każ aħna ve adottati x'hemm komuni fil-netwerking dinja ta 'sejħa tmien bytes ta ottett. Hawnhekk stajt speċifikat li ottetti se jkun 512, b'tali mod li ħafna bħal fil-forensika meta naqraw mazz ta bytes fi żmien, hawnhekk ukoll, aħna qed tmur biex taqra mazz ta 'ottetti fi żmien. Li jmiss mazz sħiħ ta 'fajls header. Kif ma naf li tinkludi dawn? Well I sempliċiment jaqra l-bniedem paġni għal numru ta 'funzjonijiet li aħna ser tuża f'dan distribuzzjoni kodiċi u jinkludu fil-dawk I kien struzzjonijiet biex. U issa għandna tip ta 'data. Imxejna ddikjarat bħala ottett li tkun char. U aħna ser tara aktar tard dik thats użat madwar il-kodiċi. U aħna ħadthom iddikjarata mazz sħiħ ta 'prototipi, u aħna ser jimxu malajr permezz kull waħda minn dawk il-funzjonijiet. Fl-aħħar nett, u forsi aktar importanti li wieħed iżomm mind f'dan il-punt fil- l-istorja, hija li hemm huma, fil-fatt kollu mazz ta 'varjabbli globali fil-quċċata tal-fajl, għeruq, CFD, SFD, talba, fajl u l-korp. Issa ġeneralment, jużaw tant globali varjazzjonijiet, jew varjazzjonijiet globali fil-livelli kollha, mhuwiex il-prattika lura. Iżda jirriżulta aħna wkoll qed tuża teknika msejħa tqandil sinjal aktar tard fil-kodiċi, li jippermetti li jikxfu meta l-utent hits xi ħaġa bħall CTRL C u mitfija l-server gracefully. U sabiex tagħmel dan gracefully u fil-fatt b'xejn sa memorja, għandna bżonn li jkollhom aċċess għall- dawn il-varjabbli globali. U issa ejja tagħti ħarsa lejn prinċipali, li ssuq il-totalità ta 'dan il-programm. L-ewwel nett, fil-quċċata here we ikollhom numru varjabbli żball li jidher li ma jkollhom tip, iżda li għaliex huwa attwalment definita fil-fajl imsejħa errno.h żball li huwa inkluż ogħla sa. Jekk inti tagħmel bniedem errno biex effettivament ara d-definizzjoni għal dan il-ħaġa, tkun taf tara li dan huwa varjabbli globali speċjali li titwaqqaf minn mazz sħiħ ta 'funzjonijiet mhux miktub mill minna, iżda mill-awturi tal-Linux u sistemi oħra li attwalment stabbiliti numru li dak il-varjabbli meta xi ħaġa tmur ħażin sabiex inti tista 'globalment ċifra barra dak li għamilt tmur ħażin. Issa stabbiliti hawn taħt inti ser tara ġdida teknika forsi jużaw getopt, funzjoni li tgħin kmand parse argumenti linja tant li nagħmlu mhux jkollhom li jolqot ħela ta 'ħin li jidhru kif parse xi ħaġa simili 8080, jew p sing, jew h sing biex tikseb l-għajnuna. getopt essenzjalment ma li għalina. Ara l-paġna bniedem għal aktar. Sussegwentement, nagħmlu daqsxejn ta 'żball verifika biex tagħmel żgur li n-numru tal-port huwa fi ħdan il-firxa speċifikata fil-spec. Sussegwentement, naraw sejħa għall-funzjoni tibda, li d-definizzjoni aħna ser tħares lejn fil-mument, u bħala l-isem tagħha jissuġġerixxi, dan jibda l-web server. Hawnhekk għandna sejħa għal funzjoni imsejħa sinjal li jgħid, jekk u meta inti tisma 'Kontroll C minn keyboard-utent, imorru quddiem u sejħa funzjoni msejħa handler li għaddej affarijiet li finalment tnaddaf u jieqfu l-server. Hawn taħt dan huwa dak li jidher li jkun hemm loop infinita, l-ewwel linja ta 'liema effettivament huwa sejħa għal funzjoni msejħa reset, li aħna lilna nfusna jimplimentaw aktar tard sabiex biex tilliberalizza xi wħud mill-istati globali tagħna. Wara li hija linja ta ' kodiċi li kondizzjonalment qed jiċċekkja r-ritorn valur ta 'konnessi. Jistenna Issa konnessi bħal relattivi, xi ħaġa li jirritorna vera jew falza. U dan huwa minnu, iżda hemm xi ħaġa speċjali fil konnessi f'dik huwa sejħa imblukkar. Hija se joqogħdu hemm u stenna sakemm browser ta 'utent tipprova li jgħaqqdu din il-web server u biss mbagħad ser ikun ritorn vera jew falza sabiex inkunu jipproċedi għal ġewwa ta 'dan jekk id-dikjarazzjoni. Ladarba hemm, avviż din il-funzjoni lil funzjoni msejħa parse, li aħna kiteb, li parses kollha tal-ottetti, kollha ta 'l-bytes li jkunu ġejjin minn browser lis-server, sabiex inkunu nistgħu idejn inti lura finalment valur lil wieħed ta 'dawk varjabbli globali li ħwienet kollha ta 'l-bytes fi ftit il headers ta 'dik talba, mhux il-ġisem jekk kien hemm attwalment korp lilha. Issa stabbiliti hawn taħt aħna jibdew parse dawk headers għall-estratt subsett ta 'l-informazzjoni li aħna jimpurtahom. Speċifikament, kull l- ispeċifikazzjoni, aħna l-ewwel riedu li jitlob linja, li hija biss li ħafna ewwel linja li nisperaw jgħid xi ħaġa bħal get mmejla jew xi triq u mbagħad HTTP 1.1. Aħna qed jużaw dan metafora ta 'labra fil haystack biex tfittex partikolari Chars jew indirizzi. U fil-fatt, hemm numru ta ' funzjonijiet kodiċi tad-distribuzzjoni tagħna li inti, wisq, tista 'ssib utli meta jkunu qed ifittxu għall-valuri partikolari. Fl-aħħarnett, aħna kopja dawn bytes fi varjabbli msejħa linja, li avviż, wisq, konna allokati fuq il-munzell permezz ta 'firxa daqs dinamikament. U aħna qed deliberatament jippruvaw biex jevitaw ssejjaħ malloc għaliex darb'oħra, għaliex ta 'Kontroll C li karatteristika potenzjal ta 'dan il-programm, aħna Ma rridx li jkollhom dan il-kodiċi f'daqqa interrott mill-laqtu utent Kontroll C, ir-riżultat ta 'liema huwa li jien ma jista 'jkollhom ċans għal xi ħaġa b'xejn stajt malloced. Hekk jien jippruvaw jużaw kemm tal-munzell hu nista hawn. Sussegwentement up, mazz sħiħ ta 'l dos. L-ispeċifikazzjoni ser jesponu fuq eżattament x'hemm mistenni hawn, iżda l-kummenti jtik ħjiel ta 'dak li jinsab quddiem. Inti l-ewwel bżonn li jivvalida l-linja talba u kun żgur li jidher qisu l- speċifikazzjonijiet grammatika, biex ngħidu hekk, jgħid suppost. Imbagħad għandek bżonn biex jiġi estratt xi ħaġa imsejjaħ il-mistoqsija, l-għalf out wara kwistjoni mark, bħal rajna b'eżempju Google tagħna fil-mogħdija fil parametru HD. Aħna mbagħad concatenate flimkien l-għerq tal-web server mal-passaġġ li fil li l-ewwel linja talba u jiffurmaw il-traġitt sħiħ tat il-fajl irridu li tfittex. Wara dan, aħna qed tmur biex tagħmel żgur li teżisti l-fajl u tinqara. U allura aħna qed tmur biex jiġi estratt tagħha estensjoni fajl, il-Html jew il-PHP, jew xi estensjoni bħal dan huwa fil- ħafna tarf tas-sekwenza mitluba. Li jmiss up huwa kollu kemm hu mazz ta 'kodiċi we kiteb li attwalment tiġġenera PHP kontenut għalik iġġenerat. Fil-qosor, dan kodiċi għandha jkollha fl-isem tal-fajl li inti tixtieq PHP biex tinterpreta. Aħna tgħaddiha minn xi ħaġa imsejħa pajp fis interpretu PHP. Terġa 'lura t-twegibiet kif għalkemm ir-rispons kienu file nnifsu. U allura aħna jtenni fuq dik tal-fajl bytes, ġbid lilhom kollha fis buffer wieħed sabiex inkunu nistgħu finalment tipprintjahom out. Tabilħaqq, dawn kollha jitlob hawn biex dprintf tippermetti magħna biex jistampaw xi ħaġa imsejħa deskrittur fajl, li huwa biss integer li jirrappreżenta fajl. Simili ħafna fl-ispirtu, imma fundamentalment differenti minn fajl pointer star. Avviż kif tista 'tuża sintassi bħal printf hawn hekk li nista dinamikament daħħal xi ħaġa bħall-tul għall-valur ta 'header HTTP imsejħa Kontenut Tul. U finalment I użat il- dritt li attwalment jiktbu funzjoni l-korp għat-talba. Sfortunatament, aħna implimentati biss appoġġ għall dinamikament fajls PHP ġġenerati. Aħna ma jimplimentaw appoġġ għall fajls statiċi simili gifs, u jpegs, u CSS u HTML fajls. Dan, sfortunatament, titħalla lilek biex twieġeb għall-iskop klijent dan li tagħmel. Allura fil hemm inti ser issib li hemm mhux wisq ispirazzjoni f'dak blokk, imma jekk inti ftit ogħla sa lejn kif aħna marru dwar interpretazzjoni kodiċi PHP, l-funzjonijiet inti ser tuża huma ftit differenti. Fil-fatt, inti tista 'tissellef ftit mill-funzjonalità forsi mill-forensika sett problema, għaliex fl-aħħar tal-ġurnata kollha li għandek bżonn biex nagħmlu hawnhekk huwa li ladarba inti taf liema fajl miftuħ u ladarba inti taf huwa l-hekk imsejħa Tip MIME jew tip kontenut, għandek bżonn biex jaqra f'dawk bytes u b'xi mod bżiq lura out. U issa tour ta 'dan funzjonijiet oħra fajl tal. Up ewwel hu mqabbad, li sempliċement prospetti vera meta finalment jisma konnessjoni minn utent. Li jmiss up huwa żball. Error, sadanittant, bħala funzjoni aħna kiteb biex jimmaniġġjaw kollha ta 'l differenti 400 u l-istatus 500 HTTP kodiċijiet li inti tista 'tixtieq li jibgħat lura lill-utent, flimkien ma 'messaġġ standard. Li jmiss up huwa tagħbija, a partikularment funzjoni meaty, li l-iskop fil-ħajja huwa li jaqra minn stilla fajl pointer l kontenut ta 'fajl ġo buffer globali li aħna ddikjarat globalment hawn fuq [? prinċipali. ?] Dan huwa daqsxejn kumpless għaliex aħna għandek taqra l-bytes mill-fajl iżda ċċekkja fuq kull iterazzjoni jekk konna diġà laqat l-aħħar tal-fajl jew xi ħaġa oħra marret ħażin. U nużaw realloc biex tiżgura li ikun x'ikun buffer aħna qed jużaw qed jikber u li qed jikber u li qed jikber u dejjem toqgħod qabel il-numru ta 'bytes li għandna bżonn biex tajbin fil hemmhekk. Handler, sadanittant, hija il-funzjoni li gets imsejħa permezz ta 'wara Kontroll C reġistrat bħala sinjal li aħna rridu li jinterċettaw. Avviż hawn fil handler li finalment sejħiet stop, li naturalment iwaqqaf il-web server. U sfortunatament, Lookup ma jiġix implimentat. Fl-ispirtu, dan huwa funzjoni pjuttost sempliċi. Minħabba estensjoni fajl, jeħtieġ biex jirritorna huwa l-hekk imsejħa MIME tip jew tip kontenut. U aħna jispeċifikaw fl-ispeċifikazzjoni dak li l-immappjar għandu jkun. Imma għandek bżonn biex tittraduċi finalment għall-kodiċi c. Li jmiss up huwa funzjoni simili meaty tagħna imsejħa parse, l-iskop tagħhom fil-ħajja huwa li jaqra, mhux minn fajl, iżda minn konnessjoni tan-netwerk. Speċifikament, qari u parsing l Talba HTTP thats ġejjin minn browser lis-server hekk li finalment nistgħu parse fil biss l-intestaturi fit-talba line u r-ritorn dawk lilek permezz ta 'buffer globali li aħna ddikjarati hawn fuq [? prinċipali. ?] Irrisettja, sadanittant, hija funzjoni li niddefinixxu li gets imsejħa iteratively ġewwa ta prinċipali kull darba int dwar lest biex jibda jisma għal konnessjoni ġdida sabiex inkunu dejjem nafu l-istat ta 'varjabbli tagħna u hekk li konna wkoll ħelset kwalunkwe memorja li seta 'kien allokat għal konnessjoni tan-netwerk preċedenti. Li jmiss up jiġifieri tibda, il- funzjoni li aħna kiteb li fih sħiħa lott ta 'kodiċi tan-netwerking li finalment jibda l-web server. Last up huwa l-funzjoni imsejħa stop, li ma eżattament dan, iwaqqaf il-web server. Iżda l-ewwel jillibera up kwalunkwe memorja li għadu ġie allokat. Iżda huwa finalment tappella ħruġ anki mingħajr jirritornaw kontroll funzjoni ewlenija tagħna. Fl-aħħarnett, wieħed mill- F'ħafna tekniki importanti meta jimplimentaw din il-web server huwa se tkun daqsxejn ta 'prova u żball, li jkollu browser wieħed tieqa miftuħa fi dritt u tieqa terminal fi xellug, il servers console tieqa, sabiex inti tista 'tara l-messaġġi li huma qed jintwerew fuq l-iskrin. Iżda aħjar xorta jkun terz tieqa, tieqa terminal tieni, li tuża telnet, l-użu li għalihom huwa preskritt fil-spec. U telnet huwa biss ħafna programm network sempliċi li ihallik biex nippretendu li tkun browser tieqa waħda filwaqt li tkellem lill-tieqa oħra. Dan il-mod inti tista 'tara eżattament il-kmandi testwali li huma ġejjin lura minn server klijent mingħajr ma jkollhom poking madwar iżviluppatur chrome l għodod fi altrimenti interface clunkier.