Говорник: Хајде сада да рони у код дистрибутивног и погледајте контексту у којем код пишете ће бити прекинуто. На крају дана, ти ћеш провести укупност веб сервера. Али обезбедили смо сте са костура Код да имају неку функционалност, посебно у вези са умрежавања. Хајде да погледамо. Дакле овде према врху датотеке је гомила играних тест макро захтеве. Сада ово је само одлика ц, при чему према гомили ман пагес морате да дефинишете неке од ови константе да би било истинито или да буде чак специфичне бројеве тако да имате приступ одређеним функцијама. У супротном ће бити необјављеног и нећете имати приступ. Тако сам урадио ово путем читања ман странице. Сада доле, у Линије 15 до 17, ми имају гомилу граница декларисаних. И ми смо позајмили ово из популаран веб сервер зове Апацхе. А то су само Бројеви која се дешава да се ограничи укупан број бајтова који су дозвољени у различитим контекстима за ХТТП захтева да претраживач је дозвољено да ме пошаље. Следеће, дефинишемо октета. Сада октет је само фенси начин да се каже бајт или осам битова. Испоставило се да у прошлих времена бајтова није било баш осам бита, тако октет је увек осам бита. Дакле у овом случају ми смо усвојили шта је заједничко у умрежавању свет позивања осам бајтова октет. Овде сам прецизирао да ће оцтетс бити 512, тако да слично као у форензику када смо прочитали гомилу бајтова у исто време, и овде, идемо у прочитати Гомила оцтетс одједном. Следећа гомила хеадер фајловима. Како сам знао да укључи ово? Па сам једноставно прочитао човека странице за бројним функцијама да ћемо користити у овом дистрибуцији Код и укључују у оне Речено ми је да. И сада имамо тип података. Ми смо проглашена октет да буде Чар. Па ћемо видети касније да је то користи широм кода. И ми смо прогласили гомила прототипова, а ми ћемо брзо проћи кроз сваки од тих функција. На крају, а можда највише важно је имати на смета у овом тренутку у прича, је да постоји су, у ствари цео гомила глобалних променљивих на врху датотеке, корен, ЦФД, СФД, захтев, датотека и тело. Сада углавном, користе толико глобална варијабле, или глобалне променљиве на све, није вратио пракса. Али испоставило се да такође користимо техника зове руковање сигнала касније у коду, који нам омогућава да детецт када корисник удари нешто као ЦТРЛ Ц и угасити сервера грациозно. А да би се то достојанствено и заправо ослободили меморијски, морамо да имамо приступ ови глобалне променљиве. А сада да погледамо главни, који вози целину овог програма. Прво, на врху смо овде имају грешку број променљиву који изгледа није имају тип, али то је јер то је заправо дефинисан у фајлу названом Грешка еррно.х који је укључена уз ланац. Уколико човек еррно да заправо види дефиницију за ову ствар, видећете да је ово Посебан глобална променљива да поставља гомила функција није записано код нас, али аутори Линук и друге системе да заправо сет број на тој променљиве када нешто крене наопако тако да глобално цан схватим шта је кренуло по злу. Сада доле испод видећете нови техника можда користећи гетопт, функција која помаже парсе команду аргументи тако да не треба да бринемо губи време фигурира како да анализирам нешто попут 8080, или цртица стр, или цртица ч за помоћ. гетопт суштини то ради за нас. Погледајте ман страницу за више. Следеће, радимо мало грешке проверу да се уверите да је број порта је у наведено опсег у спец. Следеће, видимо позив на функцију старт, чија дефиниција ћемо погледај у тренутку, а као своје име сугерише, ово почиње веб сервер. Овде имамо позив на неку функцију зове сигнал који каже, ако и када чујете Цонтрол Ц из Тастатура корисника, само напред и позовите функција зове трговина која се дешава да коначно чисти ствари и престани сервера. Испод тога је оно што изгледа Инфините Лооп, прва линија која ефикасно је позив до функције која се зове ресет, који сами себи имплементирати касније како да бисте ослободили неке од наших глобалних држава. Након тога је линија код које условно проверава повратак Вредност повезан. Сада повезани изгледа као предиката, нешто што се враћа тачне или нетачне. А то чини, али ту је нешто посебно у повезан у да је блокирање позива. То ће седети тамо и чекати док прегледачу корисника покушава да се повеже са овим веб сервер и тек онда ће ретурн труе или фалсе, тако да наставимо у унутрашњост ове ако изјаве. Кад су стигли, приметили ову функцију функција названа Парсе, који смо писали, које анализирају све оцтетс, све од бајтова долазе из претраживача на сервер, тако да можемо предати да си се вратио на крају вредност за један од тих глобалних променљивих које чува све од бајта у само заглавља на који Захтев, не тело да заправо постоји било тело за то. Сада доле испод почнемо да парсе те заглавља за издвајање подскуп информација да нам је стало. Конкретно, пер спецификација, ми прво желео да затражи линију, која је Само да први линија која надамо се каже нешто попут гет сласх или неки пут и онда ХТТП 1.1. Користимо ову метафору од игле у пласту сена тражити конкретно карактера или адресе. И заиста, постоји низ функције у нашем дистрибутивном коду да тебе, можда пронађете помоћи када тражите неке конкретне вредности. На крају крајева, ми копирате те бајтова у променљивом зове линије, која приметили, такође, имамо издвојила на стек путем динамично велицине низа. И ми покушавамо намјерно да се избегне позивање маллоц јер поново, јер Контрола на Ц је потенцијал карактеристика овог програма, ми не желе да имају овај код изненада прекинута корисничком удараца Контрола Ц, резултат тога је да нисам можда има шансу фор фрее нешто сам маллоцед. Дакле, ја покушавам да користе што више стека је што могу. Следеће, гомила на дос. Спецификација ће тумачити на шта се тачно овде очекује, али су коментари ти дам наговештај шта нам се спрема. Прво је потребно да потврду Рекуест Лине и уверите се да то изгледа спецификације граматика, да тако кажем, каже да би требало. Онда морате да издвојите нешто зове упит, ствари се после знаком питања, као видели смо са нашим Гоогле пример у пролазу у ХД параметар. Затим смо заједно цонцатенате корен веб сервера са стазом која је у да захтјев прва линија и формирају пуну путању фајл желимо да тражимо. Након тога, идемо да се уверите да датотека постоји и читљива. А онда ћемо извући његов филе ектенсион, .хтмл или .пхп, или нека таква екстензија која је у Веома крају низа тражене. Следеци је цела гомила кода смо писали да заправо генерише ПХП садржаје за вас. У суштини, ово цоде узима у име датотеке желите ПХП да тумаче. Ми га пролазе нешто што се зове цев у ПХП-преводиоца. Да се ​​вратим на одговор као да одговор били сам фајл. И онда смо прелазили преко тога досије бајтова, вуку их све у једну бафер тако да на крају можемо принт их. Заиста, све то позива овде да дпринтф омогућава нам да одштампате нешто назива дескриптор, који је само цео број да представља датотеку. Врло слично у духу, али фундаментално разликује од датотеке звезда показивач. Обратите пажњу како можете да користите синтаксу као иф овде тако да сам динамички могу убаците нешто као дужини за вредности ХТТП хеадер зове Цонтент-Типе. И на крају сам користио Функција право да стварно пише тело на захтјев. Нажалост, само смо реализовали Подршка за динамички генерисани ПХП датотеке. Нисмо имплементирати подршку за статички фајлови ГИФ-ова, и ЈПЕГ-ови, и ЦСС и ХТМЛ датотеке. То, нажалост, остављено је вама да одговори на сврхе клијента ово да урадим. Дакле тамо ћете наћи да постоји Не много инспирација у том блоку, али ако вас мало више горе у колико ишли смо о тумачењу ПХП код, функције ћете користити су мало другачији. У ствари, можете позајмити неки од функционалности можда од форензичара Проблем скуп, јер на крају дана све што је потребно да урадите овде је када знате шта фајл отворен и када знате да је такозвана МИМЕ тип или тип садржаја, морате да прочитате у тим бајтова и некако их пљувати напоље. А сада обилазак ово друге функције фајлу. Прво је повезан, који једноставно враћа истина када је коначно чује Прикључак од корисника. Следеци је грешка. Грешка, у међувремену, као функција смо писао за руковање све различите 400 и 500 ХТТП статус кодови да бисте можда желели треба вратити назад до корисника, заједно са стандардне поруке. Следеци је оптерећење, посебно месната функција, чија је сврха у животу се читати из датотеке звезде поинтер Садржај датотеке у глобални бафер да смо глобално проглашен изнад [? Главни. ?] Ово је помало сложена, јер смо ми морају прочитати бајтова из датотеке али проверите на сваком итерација да ли смо већ ударио крај датотеке или нешто друго је кренуло наопако. И ми користимо Реаллоц да се уверите да шта год тампон користимо расте и расте и расте и увек у предности броја бајтова да треба да се уклопи у ту. Хандлер, у међувремену, је функција која добија позвао путем имајући регистрован Цонтрол Ц као сигнал да желимо да пресретне. Обратите пажњу овде у хандлер То је то на крају Позиви стоп, што наравно зауставља веб сервер. И нажалост, лоокуп се не спроводи. У духу, ово је прилично једноставна функција. С обзиром филе ектенсион, потребно да се врате то тзв МИМЕ Тип или тип садржаја. А ми навести у спецификацији шта да мапирање мора бити. Али морате да преведете то на крају да ц кодом. Следеци је наш слично месната функција зове Парсе, чија је сврха у животу је да чита, не из датотеке, али из мрежне конекције. Конкретно, читање и рашчлањивање ХТТП захтев да је дошао из претраживача на сервер тако да коначно можемо анализирати на само заглавља у захтјеву линија и врате они вама путем глобалне пуфера који смо прогласили изнад [? Главни. ?] Ресет, у међувремену, је Функција коју смо дефинисали да бива позван итеративно унутра главног сваки пут се спремате спреман за почетак слушања за нове везе тако да увек знамо стање наших варијабли и тако да смо и ослобођен било какве меморију која Можда је издвојено за претходни мрежне везе. Следеци је старт, функција која смо писали који садржи целину Много умрежавање кода да коначно почне веб сервер. Последњи уп је функција зове стоп, који ради управо то, то зауставља веб сервер. Али прво им ослобађа било какве меморије да још је издвојено. Али на крају позива излаз чак и без враћања контроле нашем главном функцију. На крају, један од већина важне технике приликом спровођења ове веб сервер је Биће мало покушаја и погрешака, има један бровсер отворен прозор на десно и прозор терминала у лево, сервери конзола прозор, тако да могу видети поруке које су се приказује на екрану. Али би ипак боље бити треће прозор, други прозор терминала, у којој користите Телнет, коришћење за које је прописана у спец. И Телнет је само веома једноставан програм мрежа који вам омогућава да се претварате да бити прегледач у једном прозору док разговарате са другом прозору. На тај начин можете видети тачно команде текстуални да се враћају са сервера до клијента без боде око програмера Цхроме- алати у иначе цлункиер интерфејс.