Tagapagsalita: Ngayon sabihin dive sa code ng pamamahagi at tumingin sa konteksto kung saan ang code isulat mo Mawawala na tumatakbo. Sa pagtatapos ng araw, ka ng pagpunta sa ipatupad ang kabuuan ng web server. Ngunit na ibinigay namin sa inyo ang balangkas code na mayroon ilang mga pag-andar, lalo na may kaugnayan sa networking. Tingnan natin ang isang hitsura. Kaya dito patungo sa tuktok ng file ay isang bungkos ng tampok na subukan ang macro kinakailangan. Ngayon ito ay isang tampok na lamang ng c, kung saan ayon sa isang grupo ng tao na pahina kailangan mong tukuyin ang ilan sa mga constants para maging totoo o maging kahit tukoy na numero ng sa gayon ay mayroon kang access sa ilang mga pag-andar. Kung hindi man sila ay hindi nagbigay-alam at hindi ka magkakaroon ng access. Kaya ginawa ko na ito sa pamamagitan ng paraan ng pagbabasa ng mga pahina ng tao. Ngayon pababa sa ibaba, sa mga linya 15 sa pamamagitan ng 17, namin magkaroon ng isang buong bungkos ng mga limitasyon ng ipinahayag. At hiniram na namin ang mga mula sa isang tanyag na web server na tinatawag na Apache. At ang mga ito ay lamang mga numero na pupunta lilimitahab ang kabuuang bilang ng mga byte na pinahihintulutan sa iba't ibang konteksto para sa mga kahilingan ng HTTP na ang isang browser pinahintulutan upang ipadala sa akin. Sunod, tukuyin ang aming mga octet. Ngayon isang octet lamang magarbong paraan ng sinasabi ng isang byte, o walong bits. Ino-out sa nakalipas na panahon isang byte ay hindi nangangahulugang walong bits, kaya octet ay laging walong bits. Kaya sa kasong ito na pinagtibay namin kung ano ang karaniwang sa networking mundo ng pagtawag sa walong mga byte isang octet. Narito tiniyak ko na octet habilin maging 512, nang sa gayon ay halos tulad ng sa forensics kapag binabasa namin ang isang bungkos ng bytes sa isang pagkakataon, dito masyadong, kami ay pagpunta sa basahin ang isang bungkos ng mga octet sa isang pagkakataon. Susunod ang maramihang mga header ng file. Paano mo alam ko na isama ang mga ito? Well ako basahin lamang ang tao mga pahina para sa isang bilang ng mga pag-andar na gagamitin namin sa pamamahagi code at isama sa mga Ako ay itinagubilin sa. At ngayon kami ay may isang uri ng data. Ipinahayag kami ng isang octet na isang pansamantalang trabaho. At kami makita sa ibang pagkakataon na iyon ginagamit sa buong code. At kami ay nagpahayag ng ang maramihang mga modelo, at kami maglakad nang mabilis sa pamamagitan ng bawat isa sa mga function. Panghuli, at marahil pinaka mahalaga na tandaan sa ayos lang sa ito point sa ang kuwento, ay mayroong ay, sa katunayan isang buo bungkos ng mga pangkalahatang variable sa tuktok ng file, ugat, CFD, SFD, kahilingan, file at katawan. Ngayon pangkalahatan, ang paggamit ng maraming mga global variable, o mga pangkalahatang variable sa lahat, ay hindi ang kasanayan likod. Ngunit ito ay lumiliko out din namin ang gumagamit ka ng diskarte na tinatawag na pangangasiwa signal sa ibang pagkakataon sa code, na nagbibigay-daan sa amin upang matukoy kapag pinindot ng user ang isang bagay tulad ng CTRL C at shut down ang server maganda. At upang gawin iyon maganda at talagang libre up ng memorya, kailangan namin upang magkaroon ng access sa mga pangkalahatang variable. At ngayon hayaan tumagal ng isang pagtingin sa pangunahing, na humihimok ang kabuuan ng programang ito. Una, sa dito sa tuktok namin May isang error sa numero ng variable na lumilitaw na hindi magkaroon ng isang uri, ngunit iyan ay dahil ito ay talagang nilinaw sa isang file na tinatawag na Error sa errno.h na Kasama mas mataas up. Kung gagawin mo tao errno upang aktwal na makita ang mga kahulugan para sa bagay na ito, makikita mo na ito ay isang espesyal na global variable na Naka-set sa pamamagitan ng isang buong bungkos ng mga pag-andar hindi nakasulat sa pamamagitan ng sa amin, ngunit sa pamamagitan ng ang may-akda ng Linux at iba pang mga system upang aktwal na-set isang numero na variable kapag ang isang bagay na napupunta mali sa gayon ay maaari kang buong mundo malaman kung ano ang ginawa magkamali. Ngayon pababa sa ibaba makikita mo ang isang bagong diskarte di kaya gamit getopt, isang katangian na nakakatulong sa pag-parse utos argumento linya nang sa gayon ay hindi namin mag-abala sa oras ng pag-aaksaya ang pag-uunawa kung paano i-parse ang isang bagay tulad ng 8080, o gitling p, o gitling h upang makakuha ng tulong. talaga ang ginagawa getopt na para sa amin. Tingnan ang pahina ng tao para sa higit pa. Susunod, nagsasagawa kami ng kaunting error -check upang masiguro na na ang numero ng port ay sa loob ng sa tinukoy na saklaw sa spec. Susunod, makikita natin ang isang tawag sa pagpapaandar na simulan, na ang kahulugan namin Tingnan natin ang ilang mga sandali, at bilang ang pangalan nito nagmumungkahi, nagsisimula ito sa web server. Narito mayroon kami ng isang tawag sa isang function tinatawag na signal na nagsasabing, kung at kapag naririnig mo ang Control C mula sa keyboard ng gumagamit, sige at tawagan ang isang function na tinatawag na handler na nangyayari up at tumigil sa huli ay malinis na bagay sa server. Nasa ibaba iyon ang lalabas na isang walang hanggan loop, ang unang linya ng na mabisa ay isang tawag sa isang function na tinatawag na i-reset, na namin ang aming sarili ipatupad sa ibang pagkakataon upang upang magbakante ng ilan sa aming mga global na mga estado. Pagkatapos noon ay isang linya ng code na nang may pasubali ay pagsuri sa pagbalik halaga ng mga konektadong. Nakakonekta na ngayon ang hitsura tulad ng isang tambalan, isang bagay na nagbabalik totoo o hindi. At ginagawa nito, ngunit mayroong isang bagay na espesyal sa mga nakakonektang sa ito ay isang pag-block tawag. Ito ay umupo doon at maghintay hanggang sa browser ng user Sinusubukan upang kumonekta sa web server at lamang pagkatapos ang ito bumalik tama o mali sa gayon ay magpatuloy namin sa loob ng ito kung statement. Sa sandaling nandoon na, mapansin ang function na ito sa isang function na tinatawag na pag-parse, na sinulat ni namin, Pina-parse saan ang lahat ng mga octet, ang lahat ng ng mga byte na nanggagaling mula sa isang browser sa server, upang maaari naming ipasa bumalik ka sa huli ng isang halaga sa isa ng mga pangkalahatang variable na Nag-iimbak ang lahat ng mga byte in lamang ang mga header ng na kahilingan, hindi ang katawan kung mayroong talagang isang katawan dito. Ngayon pababa sa ibaba simulan namin upang -parse ang mga header i-extract isang subset ng mga impormasyon na namin na nagmamalasakit sa. Sa partikular, ayon sa mga pagtutukoy, muna namin Nais upang humiling ng linya, na lamang na ang pinaka unang linya na sana sabi ni isang bagay tulad get mabawasan nang malaki o ilan path at pagkatapos ay HTTP 1.1. Ginagamit namin ang talinghaga ng isang karayom ​​sa isang mandala ng dayami upang maghanap ng mga partikular na char o address. At sa katunayan, mayroong isang bilang ng mga function sa aming pamamahagi ng code na ikaw, masyadong, maaaring kapaki-pakinabang kapag naghahanap para sa partikular na halaga. Sa huli, kopyahin namin ang mga bytes sa linya sa isang variable na tinatawag na, na mapansin, masyadong, hindi namin inilalaan sa stack sa pamamagitan ng paraan ng isang dynamic na kasing laki ng array. At sadyang naming sinusubukang upang maiwasan ang pagtawag malloc dahil muli, dahil Pagkontrol ng pagiging C ang isang potensyal na tampok ng programang ito, kami ayaw mong magkaroon ang code na ito bigla Naantala ng pagpindot ng user Control C, ang resulta ng kung saan ay na hindi ko maaaring mayroon ng isang pagkakataon para sa libreng isang bagay na malloced ko. Kaya sinusubukan ko upang magamit bilang magkano ng stack ay maaari ko dito. Susunod, ang maramihang mga mag-dos. Pagtutukoy ay magpaliwanag sa eksakto kung ano ang inaasahan dito, ngunit ang mga komento magbibigay sa iyo ng isang pahiwatig ng kung ano ang namamalagi maaga. Kailangan mo munang patunayan ang mga linya kahilingan at tiyakin na mukha itong pagtutukoy grammar, kaya na magsalita, Sinasabi sa nararapat. Pagkatapos ay kailangan mong i-extract ang isang bagay tinatawag na query, ang mga bagay out pagkatapos ng tandang pananong, tulad ng Nakita namin sa aming mga halimbawa Google sa pagpasa sa isang parameter ng HD. Pagkatapos ay pagdugtungin kami magkasama ang root ng web server sa landas na nasa na kahilingan unang linya at bumuo ng ang buong landas ng ang file na nais namin upang tumingin para sa. Pagkatapos noon, kami ay pagpunta sa tiyakin kung umiiral ang file at naka-nababasa. At pagkatapos kami ay pagpunta sa kunin nito extension ng file, ang .html o ang .php, o ilang tulad ng extension na sa pinakadulo ng ang hiniling na string. Susunod up ay isang buo bungkos ng code na sinulat namin upang aktwal na bumuo ng PHP nilalaman para sa iyong binuo. Sa maikling salita, ito tumatagal ng code sa pangalan ng file na nais mong PHP i-interpret. Ipasa namin ito sa pamamagitan ng isang bagay na tinatawag isang pipe sa interpreter PHP ni. Kumuha ng mga pabalik sa tugon na waring ang tugon ay isang mismong file. At pagkatapos ay umulit namin sa paglipas na file bytes, kumukuha ang lahat ng ito sa isang buffer sa gayon ay maaari naming sa huli i-print ang mga ito out. Sa katunayan, ang lahat ng mga tawag dito upang dprintf Binibigyang-daan sa amin upang mag-print ng isang bagay tinatawag na isang file descriptor, na lamang ng isang integer na kumakatawan sa isang file. Na halos kapareho sa espiritu, ngunit sa panimula naiiba mula sa isang file star pointer. Pansinin kung paano mo maaaring gamitin ang syntax tulad ng printf dito nang sa gayon ay maaari ko nang pabago-bago ipasok ang isang bagay tulad ng haba para sa halaga ng isang HTTP header tinatawag na Content-Length. At sa huli kong ginagamit ang karapatan sa aktwal na magsulat ng function ang katawan sa kahilingan. Sa kasamaang palad, tanging ang ipinatupad namin suporta para sa mga dynamic na nabuo ang mga file na PHP. Hindi namin ipatupad ang suporta para sa static na mga file tulad ng gifs, at jpeg, at CSS at HTML file. Iyon, sa kasamaang-palad, na naiwan sa iyo upang tumugon sa mga layunin ng kliyente ito gawin. Kaya sa may kakailanganin mong makita na mayroong Hindi magkano inspirasyon sa loob ng bloke, ngunit kung ang isang maliit na mas mataas up sa kung paano nagpunta kami tungkol sa pagbibigay-kahulugan sa code na PHP, ang mga pag-andar gagamitin mo ay medyo naiiba. Sa katunayan, maaari mong humiram ang ilan sa mga pag-andar marahil mula sa forensics hanay problema, dahil sa pagtatapos ng araw ang lahat ng kailangan mong gawin dito ay sa sandaling malaman mo kung ano mabuksan ang file at sa sandaling alam mo na ito ay tinatawag na Uri ng MIME o uri ng nilalaman, kailangan mong basahin sa mga bytes at kahit papaano ay dumura ang mga ito pabalik out. At ngayon sa isang tour ng ito iba pang mga pag-andar file. Hanggang unang nakakonekta, na nagbabalik lamang totoo kapag ito sa wakas ay nakakarinig ng koneksyon mula sa isang user. Susunod up ay error. Error, samantala, bilang isang katangian namin ay sumulat upang pangasiwaan ang lahat ng mga iba't-ibang 400 at 500 HTTP status mga code na maaaring gusto upang magpadala ng pabalik sa gumagamit, kasama ang isang karaniwang mensahe. Susunod up ay load, isang partikular na parang karne ng function, na ang layunin sa buhay ay na magbasa mula sa isang file star pointer ang mga nilalaman ng isang file papunta sa isang pandaigdigang buffer na ipinahayag namin sa buong mundo sa itaas [? pangunahing. ?] Ito ay isang bit complex dahil namin mayroon na basahin ang mga byte mula sa file ngunit suriin sa bawat pag-ulit kung hindi namin na pindutin ang dulo ng file o ibang bagay maling naganap. At ginagamit namin realloc upang matiyak na kahit anong buffer na aming ginagamit ay lumalaking at lumalaki at lumalaki at palaging naglalagi nang mas maaga sa ang bilang ng mga byte na kailangan namin upang magkasya sa doon. Handler, samantala, ay ang function na ay makakakuha ng na tinatawag na sa pamamagitan ng paraan ng pagkakaroon nakarehistro Control C bilang isang signal na gusto naming agawin. Pansinin dito sa handler na ito sa huli tawag itigil, na siyempre Humihinto ang web server. At sa kasamaang-palad, ang paghahanap Hindi ipinatupad. Sa diwa, ito ay isang medyo simple function. Binigyan ng extension ng file, kailangan nito upang bumalik ito ay tinatawag na ng MIME uri o uri ng nilalaman. At aming tinukoy sa pagtutukoy kung ano ang dapat na pagma-map. Ngunit kailangan mo upang i-translate ito sa huli upang c code. Susunod ay ang aming parehong pag-andar parang karne na tinatawag na pag-parse, na ang layunin sa buhay ay upang basahin, hindi mula sa isang file, ngunit mula sa isang koneksyon sa network. Sa partikular, pagbabasa at pag-parse ng Kahilingan ng HTTP na dumating mula sa isang browser sa server upang ang sa huli maaari naming i-parse sa lamang ang mga header sa kahilingan linya at ibalik ang mga sa iyo sa pamamagitan ng paraan ng isang pandaigdigang buffer na ipinahayag namin sa itaas [? pangunahing. ?] I-reset ang, samantala, ay isang function na namin tukuyin ang na tinatawag ay makakakuha ng iteratively loob ng pangunahing tuwing ikaw ay tungkol sa handa nang magsimulang makinig para sa isang bagong koneksyon nang sa gayon ay palagi naming malaman ang estado ng aming mga variable at sa gayon ay nai din namin napalaya anumang memorya na maaaring na-ilaan para sa isang nakaraang koneksyon sa network. Susunod ay kung magsimula, ang -andar na aming sinulat ni na naglalaman ng isang buong maraming networking code na ganap na nagsisimula sa web server. Huling up ay ang pag-andar tinatawag na stop, na ang eksaktong iyon, Humihinto ang web server. Ngunit unang pinakakawalan nito isang anumang memory Na-na inilalaan pa rin. Pero sa huli tawag exit walang kahit bumabalik kontrol sa aming mga pangunahing pag-andar. Sa huli, ang isa sa mga pinakamahalagang mga diskarte kapag ang pagpapatupad ng mga web server na ito ay pagpunta sa maging isang bit ng pagsubok at error, pagkakaroon ng window bukas isang browser sa kanan at isang terminal na window sa ang natitira, ang mga server ng console window, nang sa gayon ay maaaring makita ang mga mensahe na na ipinapakita sa screen. Pero mas mahusay pa rin ng isang third window, ang pangalawang terminal na window, sa kung saan mo ginagamit Telnet, ang paggamit na kung saan ay inireseta sa spec. At Telnet lamang ang napaka simpleng programa ng network na nagbibigay-daan sa iyo upang magpanggap maging isang browser sa isang window habang pakikipag-usap sa kabilang window. Sa ganitong paraan maaari mong makita ang nang eksakto ang tekstuwal mga utos na bumabalik mula sa server sa client nang hindi na kinakailangang poking sa paligid ng nag-develop ng chrome mga tool sa isang kung hindi man ay clunkier interface.