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.