Spreker: Nou laat duik in die verspreiding kode en neem 'n blik op die konteks waarin die kode wat jy skryf gaan word bedryf. Aan die einde van die dag, jy gaan implementeer die geheel van die web bediener. Maar ons het ' jy met die geraamte kode wat het 'n paar funksies, veral met betrekking tot die netwerk. Kom ons neem 'n blik. So hier na die top van die lêer is 'n klomp van die funksie te toets makro vereistes. En dit is net 'n funksie van c, waardeur volgens 'n klomp van die man bladsye jy het 'n paar van te definieer hierdie konstantes om waar te wees of selfs spesifieke getalle sodat jy het toegang tot sekere funksies. Anders sal hulle onverklaarde word en jy sal nie toegang. So ek het dit gedoen by wyse van die lees van die man bladsye. Nou benede, in lyne 15 deur 17, het ons het 'n hele klomp van die perke verklaar. En ons het geleen hierdie van 'n gewilde web server genoem Apache. En dit is net getalle wat gaan die totale aantal te beperk grepe wat toegelaat word in verskillende kontekste vir die HTTP-versoek dat 'n leser word toegelaat om my te stuur. Volgende, ons definieer octets. Nou 'n oktet is net 'n fancy manier sê 'n greep of agt stukkies. Blyk in weleer 'n greep was nie noodwendig agt stukkies, so oktet is altyd agt stukkies. So in hierdie geval het ons aangeneem wat is algemeen in die netwerk wêreld van die roeping van agt grepe 'n oktet. Hier het ek vermeld dat octets sal wees 512, sodat baie soos in forensiese wanneer ons lees 'n klomp van die grepe op 'n tyd, ook hier, ons gaan 'n te lees n klomp van die octets op 'n tyd. Volgende 'n hele klomp van die kop lêers. Hoe het ek geweet dit te sluit? Wel, ek lees net die man bladsye vir 'n aantal funksies dat ons sal gebruik in die verspreiding kode en sluit in die kinders Ek is opdrag gegee om te. En nou het ons 'n data tipe. Ons het 'n oktet verklaar char te wees. En ons sal later sien dat dit is gebruik regdeur die kode. En ons het verklaar dat 'n hele klomp van prototipes, en ons sal vinnig loop deur elk van hierdie funksies. Laastens, en miskien die meeste belangrik in te hou omgee op hierdie punt in die storie, is dat daar is, in werklikheid 'n hele n klomp van die globale veranderlikes by die top van die lêer, wortel, CFD, SFD, versoek, lêer en liggaam. Nou algemeen, met behulp van so baie globale veranderlikes, of globale veranderlikes op alle, is nie die rug praktyk. Maar dit blyk ons ​​ook met behulp van 'n tegniek genoem sein hantering later in die kode, wat ons toelaat om te spoor wanneer die gebruiker tref iets soos Ctrl C en gesluit die bediener grasieus. En om te wat grasieus doen en eintlik vry op geheue, ons nodig het om toegang te hê hierdie globale veranderlikes. En nou, laat ons 'n blik op hoof, wat dryf die geheel van hierdie program. Eerstens, op die top hier 'n fout nommer veranderlike wat verskyn om nie te 'n tipe, maar dit is want dit is eintlik omskryf in 'n lêer genaamd fout errno.h wat ingesluit hoër op. As jy dit doen 'n mens Errno om werklik sien die definisie vir hierdie ding, jy sal sien dat dit 'n spesiale globale veranderlike wat word deur 'n hele klomp van funksies nie geskryf deur ons nie, maar deur die skrywers van Linux en ander stelsels om werklik ' 'n aantal aan daardie veranderlike wanneer iets verkeerd gaan, sodat jy kan die wêreld uit te vind wat het verkeerd gaan. Nou sit jy hier 'n nuwe sal sien tegniek dalk deur getopt, 'n funksie wat help parse opdrag lyn argumente, sodat ons dit nie doen nie het om tyd te mors om te pla besyfering uit hoe om iets te ontleed soos 8080, of stamp p, of stamp h om hulp te kry. getopt doen wese wat vir ons. Sien die man vir meer. Volgende, ons doen 'n bietjie van die fout nagaan om seker te maak dat die poort nommer binne die gespesifiseerde reeks in die spec. Volgende, sien ons 'n oproep na die funksie begin, wie se definisie ons sal kyk in 'n oomblik, en soos sy naam aandui, begin die web bediener. Hier het ons 'n oproep tot 'n funksie genoem sein wat sê, indien en wanneer jy hoor Control C van die gebruiker se sleutelbord, gaan voort en noem 'n funksie genoem hanteerder wat gaan om uiteindelik mooi dinge en ophou die bediener. Onder dit is wat blyk 'n wees oneindige lus, die eerste lyn van wat effektief is 'n oproep na 'n funksie genoem herstel, wat ons onsself implementeer later in orde te bevry 'n paar van ons globale state. Daarna is 'n lyn van kode wat voorwaardelik is die beheer van die opbrengs waarde van gekoppelde. Nou verbind lyk soos 'n gesegde, iets wat terugkeer waar of vals is. En dit doen nie, maar daar is iets spesiaals in gekoppelde in dat dit 'n blok oproep. Dit sal daar sit en wag totdat die leser 'n gebruiker se probeer om toegang tot hierdie web bediener en dan net sal dit terugkeer waar of vals, sodat ons voortgaan aan die binnekant van die IF-stelling. Sodra daar, dit agterkom funksie na 'n funksie genoem parse, wat ons geskryf het, wat ontleed al die octets, al van die grepe uit 'n leser na die bediener, sodat ons kan lewer jy terug uiteindelik 'n waarde aan een van daardie globale veranderlikes wat winkels al die grepe in net die kop van daardie versoek, nie die liggaam indien daar was eintlik 'n liggaam om dit te. Nou benede ons begin om te ontleed die kop te trek 'n subset van die inligting dat ons omgee. Spesifiek, volgens die spesifikasie, ons eerste wou lyn te vra, wat is net daardie heel eerste lyn wat hopelik iets soos get sê streep of 'n pad en dan HTTP 1.1. Ons gebruik hierdie metafoor van 'n naald in 'n hooimied om te kyk vir spesifieke karakters of adresse. En inderdaad, daar is 'n aantal funksies in ons verspreiding kode dat jy ook dalk nuttig vind wanneer jy soek na spesifieke waardes. Uiteindelik het ons hierdie grepe kopieer in 'n veranderlike genoem lyn, wat sien, ook ons ​​het toegeken op die stapel deur middel van 'n dinamiese grootte skikking. En ons is doelbewus probeer om te verhoed dat 'n beroep malloc want weer, want van Beheer C om 'n potensiële kenmerk van hierdie program, ons wil nie hierdie kode om skielik onderbreek deur die gebruiker slaan Beheer C, is die resultaat van wat is dat ek nie dalk 'n kans gratis iets wat ek malloced. So ek probeer om so veel gebruik van die stapel Ek kan hier. Volgende op, 'n hele klomp van te dos. Die spesifikasie sal uitlê oor presies wat hier verwag, maar die kommentaar gee jou 'n aanduiding van wat voorlê. Jy moet eers die geldigheid van die versoek lyn en maak seker dat dit lyk soos die spesifikasies grammatika, om so te praat, sê dit moet. Jy moet dan iets te onttrek genoem die navraag, die dinge uit na 'n vraagteken, soos ons gesien het met ons Google byvoorbeeld in die verbygaan in 'n HD parameter. Ons het toe koppel saam die wortel van die web bediener met die pad wat is in daardie versoek eerste reël en vorm die volle pad van die lêer ons wil om te kyk vir. Daarna gaan ons om seker te maak dat die lêer bestaan ​​en leesbaar. En dan gaan ons te onttrek sy lêer uitbreiding, die Html of die Php, of enige sulke uitbreiding wat is by die einde van die string versoek. Volgende is 'n hele n klomp van die kode wat ons geskryf het om werklik PHP genereer gegenereerde inhoud vir jou. In 'n neutedop, is hierdie kode neem in die naam van die lêer wat jy wil PHP te interpreteer. Ons gee dit deur iets genoem 'n pyp in PHP se tolk. Terug te kry die reaksie asof die reaksie was 'n lêer self. En dan het ons Itereer oor die lêer se grepe, trek hulle almal in een buffer sodat ons kan uiteindelik druk dit uit. Inderdaad, al hierdie noem hier om dprintf laat ons iets te druk bekend as 'n lêer descriptor, wat is net 'n heelgetal Dit verteenwoordig 'n lêer. Baie soortgelyk in gees nie, maar fundamenteel verskil van 'n lêer star wyser. Let op hoe jy sintaksis kan gebruik soos printf hier sodat ek kan dinamiese voeg iets soos die lengte vir die waarde van 'n HTTP-header genoem inhoud-Length. En uiteindelik het ek die funksie reg om werklik te skryf die liggaam te versoek. Ongelukkig het ons net geïmplementeer ondersteuning vir dinamiese gegenereer PHP lêers. Ons het nie ondersteuning vir implementeer statiese lêers soos gifs, en jpegs, en CSS en HTML-lêers. Dit is ongelukkig vir jou gelaat om te reageer op die kliënt doel om dit te doen. So daar sal jy vind dat daar is ' nie veel inspirasie binne daardie blok, maar as jy 'n bietjie hoër op hoe ons het oor PHP-kode interpretasie, die funksies wat jy sal gebruik is 'n bietjie anders. In feite, kan jy leen sommige van die funksies miskien van die forensiese probleem stel, want aan die einde van die dag, is al wat jy nodig het om te hier doen is as jy weet wat die lêer oop en sodra jy weet dit is die sogenaamde MIME type of inhoud tipe, wat jy nodig het om te lees in die grepe en een of ander manier spoeg hulle terug uit. En nou 'n toer van hierdie lêer se ander funksies. Up eerste is verbind, wat eenvoudig terugkeer ware wanneer dit uiteindelik hoor 'n verbinding van 'n gebruiker. Volgende is fout. Fout, intussen, as 'n funksie wat ons het al van die verskillende 400 te hanteer en 500 HTTP status kodes wat jy dalk wil terug te stuur na die gebruiker, saam met 'n standaard boodskap. Volgende is las, 'n besonder vleis funksie, wie se doel in die lewe is om te lees van 'n lêer ster wyser om die inhoud van 'n lêer in 'n globale buffer dat ons globaal verklaar bo [? hoof. ?] Dit is 'n bietjie kompleks omdat ons het die grepe uit die lêer lees maar kyk op elke iterasie of ons reeds druk op die einde van die lêer of iets anders verkeerd geloop het. En ons gebruik realloc om seker te maak dat die maak wat buffer ons gebruik is groei en groei en groei en altyd voor die aantal grepe bly wat ons nodig het om te pas in daar. Hanteerder, intussen, is die funksie wat kry genoem by wyse van ' geregistreer Control C as 'n sein wat ons wil om te onderskep. Let hier in hanteerder dat dit uiteindelik oproepe stop, wat van die kursus stop die web bediener. En ongelukkig lookup nie geïmplementeer word nie. In die gees, dit is 'n redelik eenvoudige funksie. Gegewe 'n lêer uitbreiding, is dit nodig om terug te keer is dit sogenaamde MIME tipe of inhoud tipe. En ons spesifiseer in die spesifikasie wat dit kartering moet wees. Maar jy moet om te vertaal dit uiteindelik tot c kode. Volgende is ons insgelyks vleis funksie genoem parse, wie se doel in die lewe is om te lees, nie van 'n lêer, maar van 'n netwerk konneksie. Spesifiek, lees en ontleding van die HTTP-versoek wat kom is van 'n leser na die bediener sodat uiteindelik kan ons ontleed net op die kop in die versoek lyn en terugkeer diegene aan jou deur middel van 'n globale buffer wat ons hierbo [verklaar? hoof. ?] Herstel, intussen, is 'n funksie wat ons definieer wat kry iteratief binnekant genoem van die belangrikste elke keer wat jy oor gereed om te begin luister vir 'n nuwe verbinding sodat ons altyd weet die toestand van ons veranderlikes en sodat ons het ook bevry enige geheue wat dalk vir toegeken het 'n vorige netwerkverbinding. Volgende is begin, die funksie wat ons geskryf het wat bevat 'n hele baie netwerk-kode wat uiteindelik begin die web bediener. Laaste up is die funksie genoem stop, wat doen presies dit, is dit stop die web bediener. Maar eers is dit bevry enige geheue wat nog toegeken is. Maar dit uiteindelik noem uitgang sonder om selfs terugkeer beheer aan ons belangrikste funksie. Uiteindelik, een van die belangrikste tegnieke wanneer die uitvoering van hierdie web bediener is gaan 'n bietjie van die verhoor en fout te wees, met een venster oop regs en 'n terminale venster by links, die bedieners konsole venster, sodat jy kan sien die boodskappe wat vertoon op die skerm. Maar nog beter 'n derde sou wees venster, 'n tweede terminale venster, waarin jy Telnet, die gebruik gebruik waarvoor in die spec voorgeskryf. En Telnet is net 'n baie eenvoudige netwerk program wat kan jy om voor te gee 'n leser in 'n venster terwyl jy praat op die ander venster. Hierdie manier waarop jy kan sien presies tekstuele opdragte wat kom terug vanaf bediener kliënt sonder om te skeer rondom Chrome se ontwikkelaar gereedskap in 'n andersins clunkier koppelvlak.