SPEAKER: Nun ni dive en la dissendo kodo kaj rigardu la kuntekston en kiu la kodo vi skribas tuj esti operaciante. Fine de la tago, vi iras al implementar la tuteco de la TTT-servilo. Sed ni havigis vi kun la skeleto kodo kiu havas iuj funcionalidad, aparte rilataj al retoj. Ni rigardu. Do supren tie al la supro de la dosiero faskon de trajto testi makro asignoj. Nun ĉi tio estas nur karakterizaĵo de c, per laŭ faskon de viro paĝoj vi devas difini iujn de tiuj konstantoj esti vera aŭ esti eĉ specifaj nombroj por ke vi havas aliron al iuj funkcioj. Alie ili estos nedeklarita kaj vi ne havos aliron. Do mi faris tion per maniero legi la viro paĝoj. Nun malsupre en linioj 15 tra 17, ni havas tutan faskon da limoj deklaris. Kaj ni prunteprenis tiujn de populara retservilo nomata Apache. Kaj tiuj estas nur ciferoj kiuj iras kap la suma nombro de bajtoj kiuj permesis en diversaj kuntekstoj por la HTTP-peto ke navegador estas permesita por sendi min. Venonta, ni difini octetos. Nun octeto estas nur ornama metodo diri bajto, aŭ ok bitoj. Rezultas en la pasintaj tempoj bajto ne nepre ok bitoj, tiel octet estas ĉiam ok bitoj. Do en ĉi tiu kazo ni adoptis kio estas komuna en la reto mondo de vokanta ok bajtoj octeto. Jen mi specifis ke octetos volo esti 512, tiel ke multe kiel en jura kiam ni legas faskon da bajtoj samtempe, ankaŭ ĉi tie, ni iras legi faskon da octetos samtempe. Sekva tutan faskon da kaplinio dosierojn. Kiel mi scias inkludi tiujn? Nu mi simple legis la homo paĝoj por nombro de funkcioj ke ni uzos en tiu distribuo kodo kaj inkludi en tiujn Mi estis instruita al. Kaj nun ni havas datumtipo. Ni deklaris octet esti char. Kaj ni vidos poste ke tio estas uzataj tra la kodon. Kaj ni deklarita amaso de prototipoj, kaj ni iru rapide tra ĉiu de tiuj funkcioj. Laste kaj eble plej gravas en gravas ĉe tiu punkto en la rakonto, estas ke ekzistas estas, fakte tuta faskon de tutmonda variabloj ĉe la supro de la dosiero, radiko, CFD, SFD, peto, arkivo kaj korpo. Nun ĝenerale, uzante tiom da tutmonda variabloj, aŭ tutmondaj variabloj ĉe ĉiuj, ne estas la dorso praktiko. Sed rezultu ni ankaŭ uzas tekniko nomita signalo uzado poste en la kodo, kiu permesas nin detekti kiam la uzanto batas ion kiel CTRL C kaj fermis la servilo gracie. Kaj por fari tion gracie kaj efektive liberaj supren memoro, ni bezonas havi aliron al tiuj tutmondaj variabloj. Kaj nun ni rigardu ĉefa, kiu pelas la tuteco de tiu ĉi programo. Unue, ĉe la supro tie havi eraro nombro variablo kiu aperas ne havas tipon, sed tio estas ĉar ĝi estas efektive difinitaj en dosiero nomata eraro errno.h kiu estas inkluzivita pli supren. Se vi faras homo errno al reale vidi la difinon por tiu afero, vi vidos ke ĉi tiu estas speciala tutmonda variablo ke estas difinita per aro faskon de funkcioj priskribitaj de ni, sed de la aŭtoroj de Linukso kaj aliaj sistemoj por fakte starigis numeron ke variablo kiam io fuŝas tiel ke vi povas tutmonde elkompreni faris iri malbone. Nun malsupre vi vidos nova tekniko eble uzante getopt, funkcio kiu helpas analizi komando linio argumentoj por ke ni ne devas tedi perdi tempon kalkulante , kiel eblas analizi iu kiel 8080, aŭ haltostreko p, aŭ streketo h akiri helpon. getopt esence faras ke por ni. Vidu la man-paĝon por pliaj. Tuj, ni faru iom de eraro kontrolanta por certigi ke la haveno nombro estas ene la specifita gamo en la specifon. Venonta, ni vidas alvokon al la funkcio komenci, kies difino ni rigardi en momento, kaj kiel lia nomo sugestas, ĉi startas la retservilo. Ĉi tie ni havas alvokon al funkcio nomita signalo kiu tekstas: se kaj kiam vi aŭdos Kontrolo C de la uzanto de klavaro, bonvolu voki funkcio nomita traktilo ke okazas al finfine pura aĵojn kaj halti la servilo. Sub tiu estas kio ŝajnas esti senfina buklo, la unua linio de kiu efektive estas alvoko al funkcio nomita reset, kiun ni mem implementar poste sur la objektivo liberigi iun el niaj tutmondaj ŝtatoj. Post tiu estas linio de kodo kiu kondiĉe estas kontrolanta la reveno valoro de koneksaj. Nun konektita aspektas kiel predikato, iu kiu revenas vera aŭ malvera. Kaj ĝi faras, sed estas iun speciala en koneksa en tiu ĝi estas blokado alvokon. Ĝi sidos tie kaj atendu ĝis uzanto retumilo provas konekti al tiu retejo servilo kaj nur poste ĝi reveni vera aŭ malvera tiel ke ni procedi al la interno de ĉi se aserto. Fojo tie, rimarki tiun funkcion al funkcio nomita analizi, kion ni skribis, kiu parses ĉiuj octetos, ĉiuj de la bajtoj devenante navegador al la servilo, por ke ni povas transdoni vi reen finfine valoron al unu el tiuj tutmondaj variabloj kiuj tendencas ĉiuj bajtoj en apenaŭ la kaplinioj de tiu peto, ne la korpon se efektive estis korpon al ĝi. Nun malsupre ni komencas analizi tiuj titolaj ĉerpi subaro de la informo ke ni zorgas pri. Specife, po la especificación, ni unue volis peti linio, kiu estas ĝuste tiu unua linio, ke espereble diras iu kiel get slash aŭ iun padon kaj tiam HTTP 1.1. Ni uzas tiun metaforon de kudrilo en garbejo serĉi apartan signojn aŭ adresojn. Kaj efektive, ekzistas pluraj funkciojn en nia dissendo kodo ke vi, tro, trovu helpema serĉinte apartaj valoroj. Finfine, ni kopiu tiujn bajtojn en variablo nomas linio, kiu rimarkas, ankaŭ, ni asignitaj sur la stako pere de dinamike grandeco tabelo. Kaj ni intence provas eviti nomi malloc ĉar denove, ĉar de Kontrolo C estante potenciala trajto de tiu programo, ni ne volas havi ĉi kodo subite interrompita de la uzanto bateo Kontrolo C, la rezulto de kiu estas ke mi ne havu ŝancon senpage io mi malloced. Do mi klopodas uzi tiel de la stako estas mi povos tie. Sekva supren, tuta fasko da por dos. La especificación estos klarigis sur ekzakte kio atendis tie, sed la komentojn al vi aludo de kio kuŝas antaŭe. Vi unue devas validigi la peto linio kaj certiĝu ke ĝi aspektas kiel la especificaciones gramatiko, por tiel diri, diras ĝi devus. Vi do bezonas ĉerpi ion vokis la konsulto, la aĵoj eliras post demandosigno, kiel ni vidis per niaj Google ekzemplo en pasi en HD parametro. Ni tiam concatenate kune la radiko de la ttt-servilo kun la pado kiu estas en ke peto unuan linion kaj formi la kompletan padon de la dosiero ni volas serĉi. Poste, ni iras al certiĝu ke la dosiero ekzistas kaj estas legebla. Kaj tiam ni iras ĉerpi liajn dosiersufikso, la .html aŭ la .php, aŭ kelkaj tia etendo kiu estas ĉe la tre fino de la kordo petis. Sekva supren estas tuta faskon de kodo ni skribis al reale generi PHP generita enhavo por vi. En malmultaj vortoj, ĉi kodo portas en la nomon de la dosiero kiun vi volas PHP interpreti. Lin pasas por iu nomita pipon en PHP la interpretisto. Reiri la respondo kvazaŭ la respondo estis dosieron mem. Kaj tiam ni persisti super tiu dosiero bajtoj, trenante ilin ĉiujn en unu bufro tiel ke ni povos finfine presi ilin ekstere. Ja, ĉiu el tiuj flamo tien por dprintf permesas ni presi ion nomita dosiero descriptor, kiu Estas ĝuste entjero kiu reprezentas dosiero. Tre simila en spirito, sed fundamente malsama de dosiero stelo puntero. Rimarku kiel vi povas uzi sintakson kiel printf tie por ke mi povos dinamike enmeti iun kiel la longo por la valoro de HTTP kaplinio nomis Content-Length. Kaj finfine mi uzis la funkcio rajtas reale skribi la korpo al la peto. Bedaŭrinde, ni nur implementado apogo por dinamike generita PHP dosierojn. Ni ne implementar la apogo por statika dosierojn kiel gifs, kaj jpegs, kaj CSS kaj HTML dosierojn. Tio, bedaŭrinde, estas lasita al vi por respondi al la kliento fino ĉi fari. Do tie vi trovos ke ekzistas Ne multe inspiro ene de tiu bloko, sed se vi iom pli supren en kiom ni rondiris interpreti PHP kodo, la funkciojn vi uzas estas iom malsamaj. Fakte, vi povas pruntepreni iuj de la funcionalidades eble de la jura problemo aro, ĉar ĉe la fino de la tago ĉiuj vi devas fari ĉi tie estas unufoje vi scias kion dosiero malfermita kaj unufoje vi scias ke estas tn MIME tipo aŭ enhavon tipo, vi bezonas legi en tiuj bajtoj kaj iel kraĉis ilin reen eksteren. Kaj nun oni ĝiras de ĉi dosiero aliaj funkcioj. Supren unua estas koneksa, kiuj simple donas True kiam fine aŭdas ligo de uzanto. Sekva supren estas eraro. Eraro, dume, kiel funkcio ni skribis por manipuli ĉiujn el la malsamaj 400 kaj 500 HTTP status kodoj kiuj vi eble volas por sendi reen al la uzanto, kune kun norma mesaĝo. Sekva supren estas ŝarĝo, aparte meaty funkcio, kies celo en la vivo estas legi de dosiero stelo puntero la enhavon de dosiero en tutmonda buffer ke ni deklaris tutmonde supre [? ĉefa. ?] Tiu estas iom kompleksa ĉar ni devas legi la bajtoj de la dosiero sed kontrolu sur ĉiu ripeto ĉu ni jam batis la fino de la dosiero aŭ io iris malbone. Kaj ni uzas realloc certigi ke ajn buffer ni uzante kreskas kaj kreskas kaj kreskas kaj ĉiam restante anticipe de la nombro de bajtoj ke ni bezonas havi en tie. Traktilo, dume, estas la funkcio kiu alvenas nomata per maniero, havante registrita Kontrolo C kiel signalon ke ni volas interkapti. Rimarku tie en traktilo ke fine alvokoj halti, kiu kompreneble haltigas la retservilo. Kaj bedaŭrinde, serĉo ne implementadas. En spirito, ĉi tiu estas sufiĉe simpla funkcio. Donita dosiersufikso, kiu bezonas reveni ĝi estas tn MIME tipo aŭ enhavon tipo. Kaj ni specifi en la especificación kion tio surĵeto devas esti. Sed vi devas traduki ĝi finfine al c kodo. Sekva supren estas nia simile meaty funkcio nomata analizi, kies celo en la vivo estas legi, ne de iu dosiero, sed de retaliron. Specife, legante kaj sintaksanalizi la HTTP peto kiu estas deveni retumilo al la servilo, por ke finfine ni povas analizi ĉe ĝuste la kaplinioj en peto linio kaj revenas tiuj al vi tra tutmonda buffer ke ni deklaras supre [? ĉefa. ?] Restarigi, dume, estas funkcio kiun ni difinas kiu metas nomita ripete interne de ĉefa ĉiufoje vi estas pri pretaj komenci aŭskultante por nova ligo tiel ke ni ĉiam scias la stato de nia variabloj kaj tial ni ankaŭ liberigita ajna memoro kiu povus esti asignitaj por antaŭa retaliron. Next Up estas komencas, funkcio kiun ni verkis kiu enhavas tutajn Multaj retoj kodo ke finfine komencas la retservilo. Lasta supren estas la funkcio nomata halto, kiu faras ĝuste tio, haltigas la retservilo. Sed unue ĝi liberigas supren ajnan memoron kiu ankoraŭ estis asignitaj. Sed fine flamo eliro eĉ sen reveni kontrolo al nia ĉefa funkcio. Finfine, unu el la plej gravaj teknikoj kiam implementando ĉi ttt-servilo estas tuj estos iom de provo kaj eraro, havante unu retumilo fenestro malfermita dekstre kaj terminalo fenestro je forlasis, la serviloj konzolo fenestro, por ke vi povas vidi la mesaĝojn kiuj estas esti montrata sur la ekrano. Sed eĉ pli bone estus tria fenestro, dua fina stacio fenestro, en kiu vi uzas Telnet, la uzado por kiu estas preskribita en la specifon. Kaj Telnet estas nur tre simpla reto programo kiu permesas ŝajnigi esti navegador en unu fenestro dum parolante al la alia fenestro. Tiel vi povas vidi ĝuste la laŭteksta komandoj alvenontaj reen de servilo al kliento sen devi ŝovas ĉirkaŭ chrome la desarrollador iloj en alie clunkier interfaco.