Доповідач: Тепер давайте перейдемо в код розподілу і поглянути на контекст в якому написаний вами код буде, буде функціонувати. Зрештою, Ви збираєтеся здійснити Сукупність веб-сервера. Але ми надали Ви зі скелетом код, який є деякі функціональні можливості, особливо пов'язаних з мережами. Давайте поглянемо. Так тут до вершини файлу є зв'язка з функції перевірки макросів вимогам. Тепер це просто особливість С, в результаті чого відповідно з купою штучних сторінок Ви повинні визначити деякі Ці константи, щоб бути правдою або бути навіть конкретні цифри так, що у вас є доступ до певних функцій. В іншому випадку вони будуть Неоголошена і ви не будете мати доступ. Так що я зробив це шляхом читати довідкові сторінки. Тепер внизу, в лінії 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 інтерфейс.