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.