Лектор: Сега нека да се потопите в кода за дистрибуция
и ги накарайте да поглеждат в контекста в които като пишете
ще се оперира.
В края на деня, започваш да се приложат
целостта на уеб сървъра.
Но ние сме предвидили вие със скелета
код, който има някаква функционалност, особено във връзка с изграждане на мрежи.
Нека да разгледаме.
>> Така че тук към върха на файла е един куп
на функция тествате макро изисквания.
Сега това е само функция на C, при което според един куп човека страници
трябва да определите някои от тези константи да са верни
или да бъде още по-конкретни цифри, така че Вие имате достъп до определени функции.
В противен случай те ще бъдат декларирани и вие няма да имате достъп.
Така че съм направил това, като начин на четене страниците на човека.
Сега по-долу, в линии 15 до 17, ние
има цял куп ограничения, обявени.
>> И ние сме заели тези от популярния уеб сървър, наречен Apache.
И това са само числа, които се случва
да ограничи общия брой байтове, които са позволени
в различни контексти за искане на HTTP които браузърът е позволено да ми изпратите.
На следващо място, ние определяме октета.
Сега октет е само един луксозен начин да казва един байт, или осем бита.
Оказва се, че в недалечното минало байт не е било непременно осем бита,
така октет е винаги осем бита.
Така че в този случай ние сме приети това, което е често срещана в мрежа
свят на обадите осем байта октет.
>> Тук съм уточни, че октета ще е 512, така че много прилича на съдебната медицина
когато четем куп байта, и тук,
ние ще прочета куп октета в даден момент.
Следваща цял куп заглавните файлове.
Откъде знам, да ги включат?
Ами аз просто прочетете мъжът страници за редица функции
които ще използваме в тази дистрибуция код и включват тези, в
Бях инструктиран да.
>> И сега имаме тип данни.
Ние сме обявили октет да бъде Чар.
И ние ще видим по-късно, че това е използван в кода.
И ние сме обявен за куп прототипи,
и ние ще ходим бързо през всяка от тези функции.
Накрая, и може би най- важно да се има
ум в този момент в историята, е, че има
са, в действителност цяло куп глобални променливи
в горната част на файла, корен, CFD, SFD, искане, файл и тялото.
>> Сега като цяло, като се използва толкова много глобалното променливи или глобални променливи на всички,
Не е практиката обратно.
Но се оказва, ние също така се използва техника, наречена обработка на сигнала по-късно
в кода, който ни позволява да откриване, когато потребителят натисне нещо
като CTRL C и затвори сървъра грациозно.
И за да се направи това грациозно и действително свободна памет,
ние трябва да имат достъп до тези глобални променливи.
>> А сега нека да разгледаме най-основното, което задвижва изцяло от тази програма.
Първо, в горната тук има променлива грешка номер
които изглежда, че не имат вид, но това е
защото това е действително дефинирани във файл, наречен
errno.h грешка, която е включена по-нагоре.
Ако все пак човек errno действително виж определението за това нещо,
ще видите, че това е специална глобална променлива, че
се определя от цял ​​куп на функции не написано
от нас, но от авторите на Linux и други системи за реално фигурира
номер на тази променлива, когато нещо се обърка, така че можете световен мащаб
разбера какво е направил да се обърка.
>> Сега по-долу ще видите един нов Техниката може би с помощта на getopt,
функция, която помага синтактична команда линия аргументи, така че ние не
да се притеснявам загуба на време, фигуриращ как да се направи разбор нещо като 8080,
или пробив р, или пробив часа, за да получите помощ.
getopt същество прави това за нас.
Вижте страницата на човек за повече.
>> След това, ние правим малко грешки проверка, за да се уверите,
че броят на пристанището е в рамките определения диапазон в спец.
На следващо място, ние виждаме едно обръщение към функцията започнете, чиято дефиниция ние ще
Посетете в един миг, тъй като името му подсказва, това започва на уеб сървъра.
Тук имаме покана към функция наречен сигнал, който казва,
ако и когато чуете Control C от клавиатура на потребителя, давай напред и да се обадя
функция, наречена манипулатор, че ще ходи в крайна сметка нещата да се изчистят и да се спре
сървъра.
>> По-долу, че е това, което изглежда, че е безкраен цикъл, на първа линия на която
ефективно е на повикване към функция, наречена
нулиране, които сами сме приложи по-късно, за
да освободи някои от нашите глобални членки.
След това е ред на код, който условно
проверява връщането стойност на свързания.
Сега свързани изглежда като предикат, нещо, което се връща истина или лъжа.
И това е така, но има нещо специално в свързаното
в които това е блокирането на повикванията.
Той ще седи там и да чакат до браузъра на потребителя
се опитва да се свърже с този уеб сървър и само тогава тя ще
върнете вярно или невярно, така че ние се процедира към вътрешността на това, ако отчет.
>> Там забележите тази функция на функция, наречена разбор, които написахме,
което прави разбор на всички октета, всички от байтове, идващи от браузър
към сървъра, така че можем да предадат те обратно в крайна сметка на стойност до една
на тези глобални променливи, които магазини всички байтове в точно
заглавията на които искане, не тялото
ако има действително бяха тяло към нея.
>> Сега по-долу ние започваме да разбор тези заглавки за извличане
подмножество на информацията че ни е грижа за.
По-конкретно, според спецификация, за първи път
Исках да поиска линия, която е само, че първата линия, която
надявам се казва нещо като GET наклонена черта или някакъв път и тогава HTTP 1.1.
Ние използваме тази метафора на игла в купа сено
да се търси конкретно овъгли или адреси.
И наистина, има редица функции в дистрибуторската ни код
че вие ​​също може да намерите полезна при търсенето на конкретни стойности.
>> В крайна сметка, ние копирате тези байтове в променлива наречена линия,
които забележите, прекалено сме разпределена на стека
чрез динамично оразмерена масив.
И ние умишлено се опитва да не се налага ангажирането изчистване
защото отново, тъй на Control C е
потенциален функция на тази програма, ние не искам да имам този код изведнъж
прекъсната от потребителя удряне Контрол С, в резултат на което
е, че за да нямам шанс безплатно нещо съм malloced.
Така че аз се опитвам да се използват толкова много на топчето е мога тук.
>> Следващата, цял куп за DOS.
Спецификацията ще изложа от това какво точно се очаква тук,
но коментарите ви дават намек за това, което предстои.
Най-напред трябва да се утвърждава искането линия
и се уверете, че тя изглежда като на спецификации на граматиката, така да се каже,
казва, че трябва.
След това трябва да се извлече нещо наречено запитването, хапката
след въпросителен знак, като видяхме в нашия пример Google
при преминаване в HD параметър.
Ние след това свързвам заедно коренът на уеб сървъра
с пътя, който е в това искане първа линия
и образуват пълния път файла, което искаме да търсим.
>> След това ние ще се уверете, че че файлът съществува и е разбираемо.
И тогава ние ще извлече своята разширението на файла, в .html или .php,
или нещо подобно разширение, което е най- самия край на искания низ.
Следващата е цяло куп код писахме
да всъщност генерира PHP генерирано съдържание за вас.
С две думи, това Кодексът взема в името
на файла, който искате PHP да тълкува.
Ние го подмине нещо, наречено тръба в интерпретатор на PHP.
Връщай се на отговор, като че отговорът беше самият файл.
И тогава ние обхождане на този файл е байта, ги дърпа в един буфер
така че ние можем в крайна сметка ги разпечатате.
>> Всъщност, всички от тях призовава тук да dprintf
ни позволява да отпечатате нещо нарича файлов дескриптор, който
е само цяло число че представлява файл.
Много подобни по дух, но коренно различна от файл
звезден показалеца.
Забележете как можете да използвате синтаксис като ФОРМАТ тук, така че аз може динамично
вмъкнете нещо като дължината за стойността на HTTP хедър
наречена Content-Length.
И в крайна сметка аз бях на функция правото да впишете
тялото на искането.
>> За съжаление, ние изпълнява само подкрепа за динамично
генерирани PHP файлове.
Ние не въведе подкрепа за статични файлове като GIF файлове и JPEG снимки,
и CSS и HTML файлове.
Това, за съжаление, се оставя да отговори на целите на клиента
това да бъде направено.
Така че там ще откриете, че има Не много вдъхновение в този блок,
но ако сте малко по-нагоре от това колко отидохме за интерпретиране PHP код,
функциите, които ще използвате са малко по-различна.
>> Всъщност, можеш да вземеш някои от функционалността
може би от криминалистите проблем набор, защото
в края на деня всичко, което трябва да направите тук е след като знаете какво отворен файл
и след като знаеш, че това е така наречената MIME тип или тип съдържание,
трябва да се чете в тези байтове и някак си ги плюе обратно.
>> И сега една обиколка на това други функции файла.
До първата е свързана, които просто връща лъжа
когато най-накрая чува връзка от потребител.
Следващата е грешка.
Грешка, междувременно, като функция ние пише да се справят с всички на различни 400
и 500 HTTP статус кодове, които може да искате
да изпрати обратно на потребителя, заедно със стандартно съобщение.
>> Следващата е натоварване, особено месест функция, чиято цел в живота
е да се чете от файл звезда показалеца на съдържанието на даден файл в глобална буфер
че ние обявена в световен мащаб горе [? Основната. ?]
Това е малко по-сложен, защото ние Трябва да се чете байтове от файла
но проверка на всяка итерация дали вече сме
тежко на края на файла или нещо друго не е наред.
И ние използваме презаделяне да се уверите, че каквото буфер ние използваме расте
и расте и расте и винаги пребиваващи напред на броя на байтовете
че трябва да се побере там.
Handler, междувременно, е функцията, която получава
призова чрез имащ регистрирано Control C като сигнал
че искаме да се намеси.
Забележете, тук в манипулатор че тя в крайна сметка
призовава да спрат, което, разбира се спирки на уеб сървъра.
И за съжаление, за справка не се изпълнява.
В дух, това е сравнително проста функция.
Предвид файлово разширение, тя се нуждае от да се върне това е така наречената MIME
тип или тип съдържание.
И ние уточни в спецификацията това, което трябва да бъде, че картографиране.
Но трябва да се преведат тя в крайна сметка да C код.
>> Следващата е нашия подобен начин месест функция нарича синтактична, чиято цел в живота
е да се чете, а не от файл, но от мрежова връзка.
Конкретно, четене и разбор на HTTP заявка, че е дошъл от браузър
към сървъра, така че в крайна сметка, ние може да анализира,
точно в заглавията в искането линия и връщане на онези, за да ви
чрез глобален буфер, че ние декларираната по-горе [? Основната. ?]
>> Reset, междувременно, е функция, която ние определяме
които получава нарича итеративно вътре на главния всеки път, когато сте на път
готови да започнете да слушате за нова връзка
така че ние винаги знаем състоянието на нашите променливи
и така, че ние сме също освободи всеки спомен, който
може да са били разпределени за предишна мрежова връзка.
Следващата най Старт, функция, която написахме
че съдържа цяло Много мрежи код
че в крайна сметка започва на уеб сървъра.
>> Последно нагоре е функцията наречено спирка, която
прави точно това, тя спирки на уеб сървъра.
Но първо да освободи всяка памет че все още е бил разпределен.
Но в крайна сметка тя призовава за напускане без дори да се върне контрола
нашата основната функция.
В крайна сметка, един от най- повечето важни техники
при прилагането на този уеб сървър е Ще бъде малко на опити и грешки,
като един прозорец на браузъра с отворен в дясно и терминален прозорец в
ляво, конзола за сървъри прозорец, така че да можете
може да видите съобщенията, които са се показва на екрана.
>> Но още по-добре би било една трета прозорец, втори терминал прозорец,
в който използвате Telnet, използването за които е предписано в спец.
И Telnet е просто един много проста програма мрежа
който ви позволява да се преструва, че е браузър в един прозорец
докато говорите с другия прозорец.
По този начин можете да видите точно командите текстови
които се завръщат от сървъра към клиента
без да се налага да изпълзяват около разработчик на Chrome
инструменти в иначе clunkier интерфейс.