Дакладчык: Зараз давайце пяройдзем у код размеркавання і зірнуць на кантэкст у якім напісаны вамі код будзе, будзе функцыянаваць. У рэшце рэшт, Вы збіраецеся ажыццявіць Сукупнасць вэб-сервера. Але мы падалі Вы са шкілетам код, які ёсць некаторыя функцыянальныя магчымасці, асабліва звязаных з сеткамі. Давайце зірнем. Так тут да вяршыні файла з'яўляецца звязка з функцыі праверкі макрасаў патрабаванням. Зараз гэта проста асаблівасць С, у выніку чаго у адпаведнасці з кучай штучных старонак Вы павінны вызначыць некаторыя Гэтыя канстанты, каб быць праўдай або быць нават канкрэтныя лічбы так, што ў вас ёсць доступ да пэўных функцый. У адваротным выпадку яны будуць Неабвешчаная і вы не будзеце мець доступ. Так што я зрабіў гэта шляхам чытаць даведачныя старонкі. Цяпер ўнізе, у лініі 15 праз 17, мы ёсць цэлая куча абмежаванняў, заяўленых. І мы запазычылі іх з папулярны вэб-сервер, званы Apache. І гэта толькі Нумары, якія збіраюцца абмежаваць агульная колькасць байтаў, якія дазволены у розных кантэкстах для запыту HTTP што браўзэр можа пасылаць мяне. Далей, мы вызначаем актэта. Цяпер актэт проста мудрагелісты спосаб сказаць байт, ці васьмі бітаў. Аказваецца, у мінулых байт не абавязкова было восем біт, так актэт заўсёды восем біт. Такім чынам, у гэтым выпадку мы прынялі што агульнага ў сетцы Свет называючы восем байт актэта. Тут я удакладніў, што актэта будзе быць 512, так што гэтак жа, як у судова-медыцынскай экспертызы калі мы чытаем кучу байт у той час, і тут, мы будзем чытаць куча актэтаў ў той час. Наступная цэлай кучай файлаў загалоўкаў. Як я ведаю, ўключыць іх? Ну, я проста чытаць чалавека старонак для шэрагу функцый што мы будзем выкарыстоўваць у гэтым размеркаванні код і ўключыць у іх Мне было даручана. І цяпер у нас ёсць тып дадзеных. Мы аб'яўляем, што актэт быць знак. І мы ўбачым пазней, што гэта які выкарыстоўваецца ў кодзе. І мы абвясцілі цэлая куча прататыпаў, і мы хутка прайсці праз кожны з гэтых функцый. Нарэшце, і, магчыма, найбольш Важна мець на розум ў дадзены момант у гісторыя, з'яўляецца тое, што , На самай справе ўся куча глабальных зменных у верхняй частцы файла, корань, CFD, ЮФО, просьба, файлаў і цела. Цяпер, як правіла, з выкарыстаннем так шмат глабальных пераменныя або глабальныя зменныя наогул, не вярнуўся практыцы. Але, аказваецца, мы таксама выкарыстоўваем метад, званы апрацоўка сігналаў пазней у кодзе, што дазваляе нам вызначыць, калі карыстальнік націскае што-то як CTRL-C і зачыніць Сервер хупава. А для таго, каб зрабіць гэта хупава а на самай справе вызваліць памяць, мы павінны мець доступ да Гэтыя глабальныя зменныя. А цяпер давайце зірнем на-Майне, які дыскі паўнату гэтай праграмы. Па-першае, у верхняй тут ёсць нумар зменнай памылцы што, здаецца, не ёсць тып, але гэта таму што гэта на самай справе вызначаны ў файле пад назвай Памылка errno.h, якія уключаны вышэй. Калі вы чалавек ERRNO на самай справе вызначэнне см за гэтую справу, Вы ўбачыце, што гэта спецыяльная глабальная пераменная, якая усталёўваецца цэлы букет функцый не напісана намі, але аўтары Linux і іншыя сістэмы, каб фактычна ўсталяваць Колькасць гэтай зменнай, калі што-то ідзе не так, так што вы можаце ва ўсім свеце высветліць, што ж ідзе не так. Цяпер ўнізе вы ўбачыце новы Тэхніка магчыма, з выкарыстаннем Getopt, функцыя, якая дапамагае разбору каманды аргументы каманднага радка, так што мы не прыйдзецца турбавацца бескарыснай марнаванні часу на высвятленне як разабраць нешта накшталт 8080, або працяжнік р, або працяжнік ч, каб атрымаць дапамогу. Getopt па сутнасці робіць гэта за нас. Звярніцеся да старонцы Даведніка больш. Далей, мы робім трохі памылак праверка, каб пераканацца, што нумар порта ў межах Ўказаны дыяпазон у спецыфікацыі. Далей, мы бачым выклік функцыі пачаць, вызначэнне якога мы Паглядзіце, у імгненне, і як яго імя прапануе, гэта пачынае вэб-сервер. Тут мы маем выклік функцыі называецца сігнал, які кажа, калі і калі вы чуеце кіравання З ад Клавіятура карыстальніка, ісці наперад і называць апрацоўшчык Функцыя называецца, што адбываецца у канчатковым рахунку, чыстыя рэчы і перастаць сервер. Ніжэй гэта тое, што, як уяўляецца, бясконцы цыкл, першая лінія якога эфектыўна, гэта выклік для выкліку функцыі скід, які мы бярэм на сябе ажыццявіць пазней у парадку каб вызваліць некаторыя з нашых глабальных станаў. Пасля гэтага гэта лінія код, які ўмоўна правярае вяртанне Значэнне сувязі. Цяпер, звязаныя выглядае як прэдыкатаў, тое, што вяртае ісціну або хлусня. І гэта робіць, але ёсць што-то асаблівае ў сувязі у тым, што гэта выклікае блякаваньне. Ён будзе сядзець і чакаць пакуль браўзэры карыстальніка спрабуе падлучыцца да гэтай сеткі сервер і толькі тады яна зможа вярнуцца сапраўдным або ілжывым, так што мы зыходзім да ўнутранай гэтым, калі заяву. Калі-то, заўважце, гэтую функцыю Функцыя называецца разбору, аб якім мы пісалі, які аналізуе ўсе актэтаў, усё байтаў, якія паступаюць з-браўзэр на серверы, так што мы можам перадаць Вы зноў у канчатковым рахунку, значэнне аднаго з тых глабальных зменных, якія захоўвае ўсе байт ў проста загалоўкі, што запыт, а не цела калі на самай справе было цела да яго. Цяпер ўнізе мы пачынаем разабраць гэтыя загалоўкі, каб атрымаць падмноства інфармацыі што мы клапоцімся пра. У прыватнасці, у спецыфікацыя, мы спачатку хацеў прасіць лінія, якая з'яўляецца Проста вельмі першы радок, якая мы спадзяемся, кажа нешта накшталт Get скараціць або якой-небудзь шлях, а затым HTTP 1.1. Мы выкарыстоўваем гэтую метафару іголкі ў стозе сена шукаць прыватнасці сімвалы або адрасы. І на самай справе, ёсць шэраг функцыі ў нашым кодзе размеркавання што вы таксама могуць апынуцца карыснымі пры пошуку канкрэтных значэнняў. У канчатковым рахунку, мы капіяваны гэтыя байты у зменнай з імем лініі, якія заўважылі, занадта, мы ў стэку шляхам дынамічнага памеру масіва. І мы свядома спрабуе каб пазбегнуць выкліку Таноса таму што зноў, таму што з-пад кантролю C з'яўляецца Патэнцыял асаблівасцю гэтай праграмы, мы не хочаце, каб гэты код раптам перапынена карыстальнікам ўдару Кантроль С, у выніку якой з'яўляецца тое, што я не мог ёсць шанец для вольнага то я malloced. Так што я спрабую выкарыстоўваць так шмат стэка, я можаце тут. Затым, цэлым букетам у DOS. Спецыфікацыя выкласці на тое, што чакаецца тут, але каментарыі вам намёк на тое, што ляжыць наперадзе. Спачатку вы павінны праверыць радок запыту і пераканайцеся, што яна выглядае як Характарыстыкі граматыкі, так бы мовіць, кажа, што трэба. Затым трэба атрымаць што-то называецца запыт, рэчыва, з пасля пытальніка, як мы бачылі наш прыклад Google Адначасна ў параметры HD. Мы затым злучыце разам корань вэб-сервера са шляху, якая знаходзіцца ў што запыт на першай лініі і ўтвараюць поўны шлях файл, які мы хочам шукаць. Пасля гэтага, мы збіраемся, каб пераканацца, што файл існуе і даступны для чытання. А потым мы збіраемся атрымаць яго Пашырэнне файла, .html або .php, ці некаторыя такія пашырэнне, якое па крайняй самы канец радка прасіў. Далей ідзе ўся куча кода, які мы напісалі на самай справе генераваць PHP кантэнт для вас. У двух словах, гэта код бярэ ў імя файла, які вы хочаце PHP для інтэрпрэтацыі. Мы праходзім яго, што называецца труба ў перакладчыка PHP. Атрымаць назад адказ, як быццам Адказ быў сам файл. І тады мы перабраць гэтага файла байт, пацягнуўшы іх усё ў адзін буфер так што мы можам у канчатковым рахунку, раздрукаваць іх. На самай справе, усе гэтыя называе тут, каб dprintf дазваляе нам друкаваць што-то называецца дэскрыптар файла, які гэта проста цэлы лік які ўяўляе сабой файл. Вельмі блізкія па духу, але прынцыпова адрозніваецца ад файла зорка паказальнік. Звярніце ўвагу, як можна выкарыстоўваць сінтаксіс, як Printf тут, так што я магу дынамічна ўставіць нешта накшталт даўжыні для значэння загалоўка HTTP называецца Content-Length. І ў канчатковым рахунку я выкарыстаў Функцыя права на самай справе пісаць цела запыту. На жаль, мы толькі рэалізаваны падтрымка для дынамічна генерыруюцца PHP файлы. Мы не рэалізавалі падтрымку статычныя файлы, такія як GIF-файлаў, і ў фармаце JPEG, і CSS і HTML файлы. Гэта, на жаль, застаецца з вамі у адказ на мэты кліента гэта рабіць. Дык там вы выявіце, што ёсць не так шмат натхнення ўнутры гэтага блока, але калі вы крыху вышэй, як мы пайшлі аб тлумачэнні PHP код, функцыі, якія вы будзеце выкарыстоўваць трохі адрозніваецца. На самай справе, вы можаце ўзяць некаторыя функцыі магчыма, з судова-медыцынскай экспертызы Праблема набор, таму што у рэшце рэшт, усё што вам трэба зрабіць тут калі-то вы ведаеце, што файл адкрыты і як толькі вы ведаеце, што гэта так называецца Тып MIME або тып змесціва, Вы павінны прачытаць у гэтых байтах і як-то пляваць іх назад. А цяпер тур гэта іншыя функцыі файла. У першую чаргу звязана, які проста вяртае ісціну калі ён, нарэшце, чуе Злучэнне ад карыстальніка. Далей ідзе пра памылку. Памылка, тым часам, як функцыя, якую мы напісаў у звароце усе розныя 400 і статус 500 HTTP коды, якія вы можаце Каб адправіць назад карыстачу, разам са стандартным паведамленнем. Далей ідзе нагрузка, асабліва мясістыя функцыя, мэта якога ў жыцці чытаць з файлавай зоркі паказальнік Змесціва файла ў глабальным буферы што мы абвешчаныя глабальна вышэй [? галоўны. ?] Гэта даволі складана, таму што мы павінны прачытаць байт з файла але праверце, на кожнай ітэрацыі Ці маю ўжо трапіў у канец файла або яшчэ што-то пайшло не так. І мы выкарыстоўваем пераразмеркаваць, каб пераканацца, што усе буфера мы выкарыстоўваем расце і ўсё расце і расце і заўсёды апярэджваць лік байтаў, што мы павінны ўпісвацца ў там. Хэндлер, тым часам, функцыя, якая атрымлівае называецца шляхам, які мае зарэгістравана кіравання C у якасці сігналу што мы хочам перахапіць. Звярніце ўвагу, тут, у апрацоўшчык што ў канчатковым выніку і выклікі прыпынку, што, вядома, спыняе вэб-сервер. І, на жаль, пошук не рэалізаваны. У духу, гэта даволі простая функцыя. Улічваючы пашырэнне файла, ён павінен вярнуцца гэта так званы MIME тып або тып змесціва. І мы паказваем ў апісанні што гэта адлюстраванне павінна быць. Але для гэтага трэба перавесці гэта ў канчатковым рахунку кода на C. Затым наша аналагічна мясістыя функцыя называецца разбору, якога мэта ў жыцці гэта чытаць, а не з файла, а ад сеткавага злучэння. У прыватнасці, чытанне і аналіз Запыт HTTP, які прыйшоў з браўзэра на серверы, так што у канчатковым рахунку, мы можам разабраць за ўсё ў загалоўках запыту лініі і вярнуцца тых, да вас шляхам глабальнага буфера, мы абвясцілі вышэй [? галоўны. ?] Скід, тым часам, функцыя, якую мы вызначым што выклікаецца шматкроць ўнутры асноўны кожны раз вы збіраецеся гатовыя, каб пачаць праслухоўванне Для новага злучэння так што мы заўсёды ведаем, стан нашых зменных і так, што мы таксама вызваліў любую памяць, якая можа быць выдзелена папярэдняя падключэнне да сеткі. Затым гэта пачаць, функцыя, якую мы напісалі які змяшчае ўсю шмат сеткавай код што ў канчатковым выніку пачынае вэб-сервер. Апошняе створым функцыю называецца прыпынак, якая робіць менавіта тое, што яго спыняе вэб-сервер. Але спачатку ён вызваляе ўсю памяць, што да гэтага часу было выдзелена. Але ў канчатковым выніку гэта выклікае выхад нават не вяртаючы кіраванне да нашай асноўнай функцыі. У канчатковым рахунку, адзін з Найважнейшымі метады Пры рэалізацыі гэтага вэб-сервер будзе трохі спроб і памылак, маючы адкрытае акно аднаго браўзэра справа і акно тэрмінала на злева, кансольныя серверы акно, так што вы можна ўбачыць паведамленні, якія адлюстроўваецца на экране. Але ўсё-ткі лепш было б на траціну Акно, другое акно тэрмінала, у якой вы карыстаецеся Telnet, выкарыстанне для якіх прадпісана ў спецыфікацыі. І Telnet проста вельмі простая сеткавая праграма што дазваляе прэтэндаваць на быць браўзэр у адным акне падчас размовы ў іншае акно. Такім чынам, вы можаце бачыць роўна тэкставыя каманды што вяртаюцца ад сервера да кліента без тыкаць вакол распрацоўніка ў Chrome інструменты ў адваротным выпадку clunkier інтэрфейс.