1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 Говорник: Сега ајде да нуркаат во дистрибуција код 3 00:00:11,730 --> 00:00:14,470 и да ги разгледаме во контекст во кои кодот го пишувам 4 00:00:14,470 --> 00:00:15,780 се случува да биде оперативен. 5 00:00:15,780 --> 00:00:17,350 На крајот на денот, си оди за да се спроведе 6 00:00:17,350 --> 00:00:18,710 целината на веб сервер. 7 00:00:18,710 --> 00:00:20,460 Но, ние се предвидени ти со скелет 8 00:00:20,460 --> 00:00:24,090 код, кои имаат некои функционалност, особено во однос на вмрежување. 9 00:00:24,090 --> 00:00:25,390 Ајде да ги разгледаме. 10 00:00:25,390 --> 00:00:27,560 >> Значи тука кон врвот на датотеката е еден куп 11 00:00:27,560 --> 00:00:30,020 на функција тестираат макро барања. 12 00:00:30,020 --> 00:00:33,570 Сега ова е само карактеристика на C, при што според еден куп на man-страници, 13 00:00:33,570 --> 00:00:36,410 што треба да се дефинираат некои од овие константи за да биде вистина 14 00:00:36,410 --> 00:00:39,920 или да биде дури и на специфичните броеви, така што вие имате пристап до одредени функции. 15 00:00:39,920 --> 00:00:42,470 Во спротивно тие ќе бидат необјавени а ти не ќе имаат пристап. 16 00:00:42,470 --> 00:00:45,340 Па јас го направив тоа со начинот на кој на читање на man-страници. 17 00:00:45,340 --> 00:00:48,410 Сега долу, во линии од 15 до 17, ние 18 00:00:48,410 --> 00:00:50,550 имаат целиот куп на границите објавени. 19 00:00:50,550 --> 00:00:53,370 >> И ние позајмени овие од популарен веб сервер наречен Апачи. 20 00:00:53,370 --> 00:00:54,650 И овие се само броеви кои се случува 21 00:00:54,650 --> 00:00:56,810 да се капа на вкупниот број на бајти кои се дозволени 22 00:00:56,810 --> 00:01:01,930 во различни контексти за HTTP барање дека прелистувачот е дозволено да ме испрати. 23 00:01:01,930 --> 00:01:04,310 Следниот, ние се дефинира октети. 24 00:01:04,310 --> 00:01:07,790 Сега еден октет е само фенси начин на велејќи бајт, или осум бита. 25 00:01:07,790 --> 00:01:10,720 Излегува во недалечното минато бајт не е нужно осум бита, 26 00:01:10,720 --> 00:01:12,339 па октет е секогаш осум бита. 27 00:01:12,339 --> 00:01:14,880 Значи во овој случај ние го усвои она што е честа појава во вмрежување 28 00:01:14,880 --> 00:01:17,410 светот на повикувајќи осум бајти еден октет. 29 00:01:17,410 --> 00:01:21,840 >> Тука сум наведено дека ќе октети да биде 512, па така голем како во судска медицина 30 00:01:21,840 --> 00:01:24,170 кога читаме еден куп бајти во еден момент, и тука, 31 00:01:24,170 --> 00:01:27,390 ние ќе треба да се прочита куп на октети во исто време. 32 00:01:27,390 --> 00:01:28,922 Следна целиот куп на насловот датотеки. 33 00:01:28,922 --> 00:01:30,255 Како не знам да се вклучат овие? 34 00:01:30,255 --> 00:01:32,730 Па, јас едноставно читање на човекот страници за голем број на функции 35 00:01:32,730 --> 00:01:35,620 дека ние ќе ги користите во оваа дистрибуција код и да се вклучат во оние 36 00:01:35,620 --> 00:01:37,390 Јас беше наложено да. 37 00:01:37,390 --> 00:01:39,090 >> И сега имаме еден вид на податоци. 38 00:01:39,090 --> 00:01:41,470 Ние прогласен за октет да биде знак. 39 00:01:41,470 --> 00:01:44,040 И што ќе видиме подоцна дека тоа е се користи во текот на кодот. 40 00:01:44,040 --> 00:01:45,670 И ние го прогласија целиот куп на прототипови, 41 00:01:45,670 --> 00:01:47,961 и ние ќе одиме побрзо преку секоја од овие функции. 42 00:01:47,961 --> 00:01:50,400 И на крај, а можеби и повеќето важно да се има 43 00:01:50,400 --> 00:01:52,520 ум во овој момент во приказната е дека има 44 00:01:52,520 --> 00:01:54,520 се, всушност целина куп на глобални променливи 45 00:01:54,520 --> 00:02:00,430 на врвот на датотеката, корен, CFD, SFD, барање, датотека и телото. 46 00:02:00,430 --> 00:02:03,960 >> Сега, генерално, со користење на многу глобални променливи, или глобални променливи на сите, 47 00:02:03,960 --> 00:02:05,280 не е назад пракса. 48 00:02:05,280 --> 00:02:09,090 Меѓутоа, излезе дека ние сме, исто така, со користење на техника наречена сигнал ракување подоцна 49 00:02:09,090 --> 00:02:11,930 во кодот, која ни овозможува да детектира кога корисникот хитови нешто 50 00:02:11,930 --> 00:02:15,080 како Ctrl C и затвори серверот благодатно. 51 00:02:15,080 --> 00:02:18,240 И со цел да го направат тоа благодатно а всушност се ослободите меморија, 52 00:02:18,240 --> 00:02:20,800 ние треба да имаат пристап до овие глобални променливи. 53 00:02:20,800 --> 00:02:24,510 >> А сега, ајде да ги разгледаме во главниот, кои вози на интегритет на оваа програма. 54 00:02:24,510 --> 00:02:27,720 Прво, на врвот тука сме има грешка број променлива 55 00:02:27,720 --> 00:02:29,570 кој се појавува да не се имаат еден вид, но тоа е 56 00:02:29,570 --> 00:02:31,500 затоа што тоа е всушност дефинирани во датотека наречена 57 00:02:31,500 --> 00:02:34,800 грешка errno.h кои е вклучена повисоко. 58 00:02:34,800 --> 00:02:38,780 Ако го направите човекот errno да всушност види дефиниција за оваа работа, 59 00:02:38,780 --> 00:02:41,230 ќе видите дека ова е посебни глобалната променлива 60 00:02:41,230 --> 00:02:43,350 се поставува со еден куп на функции не е напишана 61 00:02:43,350 --> 00:02:48,730 од нас, туку од страна на авторите на Linux и други системи за да всушност го 62 00:02:48,730 --> 00:02:52,400 голем број на таа променлива кога нешто не е во ред, така што ќе може на глобално ниво 63 00:02:52,400 --> 00:02:54,830 дознаам што се случило да тргне наопаку. 64 00:02:54,830 --> 00:02:58,540 >> Сега долу ќе видите нови техника можеби користејќи getopt, 65 00:02:58,540 --> 00:03:01,790 функција која им помага да се интерпретира наредбата линија аргументи, така што ние не 66 00:03:01,790 --> 00:03:05,540 мора да се мачат да губите време да пронајдат како да се интерпретира нешто како 8080, 67 00:03:05,540 --> 00:03:08,350 или цртичка p, или цртичка ж да ви помогнеме. 68 00:03:08,350 --> 00:03:10,300 getopt во суштина го прави тоа за нас. 69 00:03:10,300 --> 00:03:11,750 Види човекот страница за повеќе. 70 00:03:11,750 --> 00:03:13,960 >> Следниот, ние се направи малку грешка проверка за да бидете сигурни дека 71 00:03:13,960 --> 00:03:17,420 дека бројот на портата е во рамките на на одреден опсег во спецификации. 72 00:03:17,420 --> 00:03:20,240 Напред, ние гледаме на повик на функција на проектот, чија дефиниција ние ќе 73 00:03:20,240 --> 00:03:24,040 погледне во еден момент, и како што самото име сугерира, ова започнува на веб серверот. 74 00:03:24,040 --> 00:03:26,960 Тука имаме повик на функција наречен сигнал кој вели: 75 00:03:26,960 --> 00:03:30,750 ако и кога ќе го слушнете контрола Ц од тастатурата на корисникот, оди напред и да се јавите 76 00:03:30,750 --> 00:03:34,650 функција наречена управувачот што се случува на крајот чисти работите и да престане 77 00:03:34,650 --> 00:03:35,500 серверот. 78 00:03:35,500 --> 00:03:39,470 >> Под тоа е она што се појавува да биде бескрајна јамка, на првата линија на која 79 00:03:39,470 --> 00:03:41,660 ефикасно да е повик до функција наречена 80 00:03:41,660 --> 00:03:45,110 ресетира, кои самите ние спроведување подоцна, со цел 81 00:03:45,110 --> 00:03:47,470 да се ослободи некои од нашите глобални држави. 82 00:03:47,470 --> 00:03:50,480 После тоа е линија на кодот кој условно 83 00:03:50,480 --> 00:03:52,576 е проверка на враќање вредност на поврзани. 84 00:03:52,576 --> 00:03:55,700 Сега поврзани личи на прирокот, нешто што се враќа точно или неточно. 85 00:03:55,700 --> 00:03:58,040 И тоа го прави, но има нешто посебно во поврзаните 86 00:03:58,040 --> 00:03:59,960 во кои тоа е блокирање на повик. 87 00:03:59,960 --> 00:04:03,180 Тоа ќе седат таму и чекаат до прелистувачот на корисникот 88 00:04:03,180 --> 00:04:05,860 се обидува да се поврзе на овој веб- сервер и само тогаш ќе го 89 00:04:05,860 --> 00:04:10,160 врати точно или неточно, така што можеме да продолжи во внатрешноста на ова ако изјава. 90 00:04:10,160 --> 00:04:13,870 >> Откако таму, забележи оваа функција на функција наречена анализирам, што пишувавме, 91 00:04:13,870 --> 00:04:17,230 кој парсира сите октети, сите на бајти кои доаѓаат од пребарувачот 92 00:04:17,230 --> 00:04:21,010 до серверот, така што можеме да го предаде ќе се врати на крајот на вредност на еден 93 00:04:21,010 --> 00:04:24,420 на оние глобални променливи кои продавници сите бајти во само 94 00:04:24,420 --> 00:04:26,630 заглавија на тоа барање, а не на телото 95 00:04:26,630 --> 00:04:28,920 ако имало, всушност, тело до неа. 96 00:04:28,920 --> 00:04:32,980 >> Сега долу да почнеме да се анализирам оние заглавја да се извлече 97 00:04:32,980 --> 00:04:35,490 подмножество на информации дека ние се грижиме за. 98 00:04:35,490 --> 00:04:37,740 Поточно, според спецификација, ние прво 99 00:04:37,740 --> 00:04:40,580 сакаше да побара линија, која е само дека првата линија која 100 00:04:40,580 --> 00:04:45,710 се надевам дека нешто како GET намалување или некој пат и тогаш HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Ние сме користење на оваа метафора на игла во haystack 102 00:04:48,150 --> 00:04:50,370 да се погледне за одредени знаци или адреси. 103 00:04:50,370 --> 00:04:53,120 И навистина, има голем број на функции во нашата дистрибутивна код 104 00:04:53,120 --> 00:04:56,930 дека вие, исто така, може да се најдат корисни кога во потрага по одредени вредности. 105 00:04:56,930 --> 00:05:00,630 >> На крајот на краиштата, ние копија на овие бајти со променлива наречена линија, 106 00:05:00,630 --> 00:05:03,510 кои забележуваат, исто така, ние сме распределуваат врз оџакот 107 00:05:03,510 --> 00:05:05,890 по пат на динамички големина низа. 108 00:05:05,890 --> 00:05:08,350 И ние намерно се обидува да се избегне повикувајќи Примерок 109 00:05:08,350 --> 00:05:11,100 бидејќи повторно, бидејќи Контрола на С се 110 00:05:11,100 --> 00:05:14,630 потенцијален карактеристика на оваа програма, ние не сакаат да имаат ова код одеднаш 111 00:05:14,630 --> 00:05:17,479 прекината од страна на корисникот, удирање Контрола Ц, поради што 112 00:05:17,479 --> 00:05:20,270 е дека јас не би можеле да имаат шанса бесплатно нешто што сум malloced. 113 00:05:20,270 --> 00:05:23,660 Па јас сум се обидува да користи онолку колку на магацинот е што можам овде. 114 00:05:23,660 --> 00:05:26,040 >> Потоа, еден куп на ДОС. 115 00:05:26,040 --> 00:05:28,930 Спецификацијата ќе излагам на токму она што се очекува тука, 116 00:05:28,930 --> 00:05:31,800 но ви даде коментари навестување на она што се наоѓа напред. 117 00:05:31,800 --> 00:05:33,830 Прво треба да се потврда на барање линија 118 00:05:33,830 --> 00:05:37,760 и бидете сигурни дека тоа изгледа како спецификации граматика, така да се каже, 119 00:05:37,760 --> 00:05:38,541 вели дека треба. 120 00:05:38,541 --> 00:05:41,290 Потоа треба да се извлече нешто повика на барањето, работи надвор 121 00:05:41,290 --> 00:05:44,200 по прашалник, како ние гледавме со нашите Гугл пример 122 00:05:44,200 --> 00:05:46,320 во донесувањето во HD параметар. 123 00:05:46,320 --> 00:05:49,050 Ние тогаш concatenate заедно коренот на веб серверот 124 00:05:49,050 --> 00:05:52,520 со патот кој е во дека барањето на првата линија 125 00:05:52,520 --> 00:05:56,010 и формирање на целосната патека на на датотеката што сакате да го барате. 126 00:05:56,010 --> 00:06:00,300 >> Потоа, ние ќе треба да бидете сигурни дека дека постои датотеката и да се прочита. 127 00:06:00,300 --> 00:06:05,100 И тогаш ние ќе треба да се извлече неговата наставката на датотеката, на .html или .php, 128 00:06:05,100 --> 00:06:09,920 или некои такви екстензија која е на самиот крај на стрингот бара. 129 00:06:09,920 --> 00:06:11,940 Потоа е целина куп на код пишувавме 130 00:06:11,940 --> 00:06:15,800 за да всушност генерираат PHP генерирани содржини за вас. 131 00:06:15,800 --> 00:06:18,010 Во мало, на овој Кодексот се во името 132 00:06:18,010 --> 00:06:20,250 на датотеката што сакате PHP да се интерпретира. 133 00:06:20,250 --> 00:06:24,630 Ние го помине нешто што се нарекува цевка во преведувач PHP е. 134 00:06:24,630 --> 00:06:28,060 Да се ​​вратам на одговор како да одговорот беа самата датотека. 135 00:06:28,060 --> 00:06:32,110 И тогаш iterate во текот на овој датотеката бајти, влече сите нив во една тампон 136 00:06:32,110 --> 00:06:34,180 така што можеме да на крајот испечатите и надвор. 137 00:06:34,180 --> 00:06:37,230 >> Всушност, сите овие повикува овде за да dprintf 138 00:06:37,230 --> 00:06:40,110 ни овозможува да се печати нешто наречен опишувач на датотека, која 139 00:06:40,110 --> 00:06:42,350 е само број што претставува датотеката. 140 00:06:42,350 --> 00:06:45,360 Многу слични во духот, но фундаментално различни од датотека 141 00:06:45,360 --> 00:06:46,620 ѕвезда покажувачот. 142 00:06:46,620 --> 00:06:50,260 Забележи како можете да го користите синтакса како printf тука, така што можам да динамички 143 00:06:50,260 --> 00:06:54,000 вметнете нешто како на должината за вредноста на HTTP заглавие 144 00:06:54,000 --> 00:06:55,270 наречен содржина должина. 145 00:06:55,270 --> 00:06:57,990 И на крајот јас се користи функцијата право да всушност пишува 146 00:06:57,990 --> 00:07:00,040 телото на барањето. 147 00:07:00,040 --> 00:07:03,750 >> За жал, ние само се спроведува поддршка за динамички 148 00:07:03,750 --> 00:07:05,350 генерирана PHP датотеки. 149 00:07:05,350 --> 00:07:08,520 Ние не ги спроведе поддршка за статични слики како GIFs, и JPEG слики, 150 00:07:08,520 --> 00:07:10,660 и CSS и HTML датотеки. 151 00:07:10,660 --> 00:07:14,450 Тоа, за жал, е оставено на вас да се одговори на клиент цел 152 00:07:14,450 --> 00:07:15,090 тоа да се направи. 153 00:07:15,090 --> 00:07:20,050 Па таму ќе најдете дека има не многу инспирација во тој блок, 154 00:07:20,050 --> 00:07:23,520 но ако малку повисоко од тоа колку отидовме во врска со толкувањето на PHP код, 155 00:07:23,520 --> 00:07:25,520 функциите што ќе го користите се малку различни. 156 00:07:25,520 --> 00:07:27,561 >> Всушност, можете да позајмите некои од функционалност 157 00:07:27,561 --> 00:07:29,620 можеби од судска медицина проблем во собата, бидејќи 158 00:07:29,620 --> 00:07:32,860 на крајот на денот сите ќе треба да направите тука е Откако ќе знаете што датотеката отворена 159 00:07:32,860 --> 00:07:35,690 и штом еднаш ќе знаат дека тоа е т.н. MIME-тип или тип содржина, 160 00:07:35,690 --> 00:07:39,040 што треба да се читаат во оние бајти и на некој начин ги плукаат назад надвор. 161 00:07:39,040 --> 00:07:41,190 >> И сега турнеја на овој други функции датотеката. 162 00:07:41,190 --> 00:07:43,820 До првиот е поврзан, која едноставно се враќа true 163 00:07:43,820 --> 00:07:47,350 кога конечно ќе го слуша конекција од корисникот. 164 00:07:47,350 --> 00:07:48,786 Потоа е грешка. 165 00:07:48,786 --> 00:07:52,296 Грешка, пак, како функција ние напиша да се справи со сите на различните 400 166 00:07:52,296 --> 00:07:55,360 и 500 HTTP статус кодови, кои можеби ќе сакате 167 00:07:55,360 --> 00:07:58,500 да ги врати назад до корисникот, заедно со стандардна порака. 168 00:07:58,500 --> 00:08:01,950 >> Потоа е оптоварување, особено месен функција, чија цел во животот 169 00:08:01,950 --> 00:08:06,920 е да се читаат од датотека ѕвезда покажувачот на содржината на датотеката во глобален тампон 170 00:08:06,920 --> 00:08:09,000 кои ги прогласи на глобално ниво над [? Главната. ?] 171 00:08:09,000 --> 00:08:12,649 Ова е малку комплексна, бидејќи ние мора да го прочитате бајти од датотека 172 00:08:12,649 --> 00:08:14,690 но проверете на секоја итерација дали ние сме веќе 173 00:08:14,690 --> 00:08:17,600 хит на крајот на датотеката или нешто не е во ред. 174 00:08:17,600 --> 00:08:21,210 И ние ги користиме realloc да бидете сигурни дека без оглед на тампон ние сме со користење е во пораст 175 00:08:21,210 --> 00:08:24,440 и расте и расте и секогаш престојуваат во пресрет на бројот на бајти 176 00:08:24,440 --> 00:08:25,675 што треба да се вклопат во таму. 177 00:08:25,675 --> 00:08:27,550 Управувачот, пак, е функцијата што добива 178 00:08:27,550 --> 00:08:30,630 наречен од страна на начин на постоење регистрирани контрола Ц како сигнал 179 00:08:30,630 --> 00:08:32,140 дека ние сакаме да се интервенира. 180 00:08:32,140 --> 00:08:34,070 Забележи овде во управувачот дека тоа на крајот 181 00:08:34,070 --> 00:08:36,780 повици запре, што секако запира веб сервер. 182 00:08:36,780 --> 00:08:39,750 И за жал, пребарување не се спроведува. 183 00:08:39,750 --> 00:08:41,940 Во духот, ова е прилично едноставна функција. 184 00:08:41,940 --> 00:08:44,900 Со оглед на наставката на датотеката, таа треба да се врати тоа е т.н. MIME 185 00:08:44,900 --> 00:08:46,320 вид или тип содржина. 186 00:08:46,320 --> 00:08:49,260 И ние наведете во спецификацијата она што мапирање мора да биде. 187 00:08:49,260 --> 00:08:52,330 Но, вие треба да се преведе тоа на крајот на C код. 188 00:08:52,330 --> 00:08:56,490 >> Потоа е наша слично месен функција наречен анализирам, чија цел во животот 189 00:08:56,490 --> 00:08:59,350 е да се прочита, а не од датотека, но од некоја мрежна конекција. 190 00:08:59,350 --> 00:09:03,510 Поточно, читање и анализирањето на HTTP барањето што доаѓаат од пребарувачот 191 00:09:03,510 --> 00:09:05,940 до серверот, така што Во крајна линија, може да се интерпретира 192 00:09:05,940 --> 00:09:09,530 во само насловите во барање линија и да ги вратат тие да ви 193 00:09:09,530 --> 00:09:12,720 по пат на глобалната тампон дека донесовме над [? Главната. ?] 194 00:09:12,720 --> 00:09:14,880 >> Ресетирај, пак, е функција која ја дефинираме 195 00:09:14,880 --> 00:09:18,730 што се нарекува iteratively во внатрешноста од главните секој пат кога сте за 196 00:09:18,730 --> 00:09:20,799 подготвена да почне да слуша за нова врска 197 00:09:20,799 --> 00:09:22,840 така што ние секогаш знаат состојбата на нашата променливи 198 00:09:22,840 --> 00:09:24,870 и така што ние сме, исто така, ослободени мемориската дека 199 00:09:24,870 --> 00:09:28,070 можеби биле наменети за претходна мрежна врска. 200 00:09:28,070 --> 00:09:30,060 Потоа е почеток, функција која пишувавме 201 00:09:30,060 --> 00:09:31,920 кој содржи целиот многу вмрежување код 202 00:09:31,920 --> 00:09:34,420 што на крајот ќе почне на веб серверот. 203 00:09:34,420 --> 00:09:36,680 >> Минатата up е функцијата наречен станица, која 204 00:09:36,680 --> 00:09:38,770 го прави токму тоа, запира веб сервер. 205 00:09:38,770 --> 00:09:42,270 Но, прво го ослободи мемориската кои се уште се распределени. 206 00:09:42,270 --> 00:09:45,850 Но, тоа на крајот го нарекува излез без дури и да се врати контрола 207 00:09:45,850 --> 00:09:47,480 на нашата главна функција. 208 00:09:47,480 --> 00:09:49,480 На крајот на краиштата, една од најважните техники 209 00:09:49,480 --> 00:09:52,680 при спроведувањето на овој веб серверот е ќе биде малку на обиди и грешки, 210 00:09:52,680 --> 00:09:55,886 има еден интернет пребарувач отворен прозорец на десната страна и терминален прозорец на 211 00:09:55,886 --> 00:09:57,760 лево, серверите конзола прозорец, така што ќе 212 00:09:57,760 --> 00:10:00,420 може да се види пораки кои се се прикажува на екранот. 213 00:10:00,420 --> 00:10:04,170 >> Но, уште подобро ќе биде една третина прозорец, вториот терминал, 214 00:10:04,170 --> 00:10:07,135 во која имате потреба при користење Телнет, користењето за кое е пропишана во спецификации. 215 00:10:07,135 --> 00:10:09,640 И Телнет е само еден многу едноставна мрежа програма 216 00:10:09,640 --> 00:10:12,660 кој ви овозможува да се преправаме да биде прелистувачот во еден прозорец 217 00:10:12,660 --> 00:10:14,540 додека зборував со другиот прозорец. 218 00:10:14,540 --> 00:10:16,830 На овој начин може да се види токму текстуални команди 219 00:10:16,830 --> 00:10:18,700 кои се враќаат од серверот до клиентот 220 00:10:18,700 --> 00:10:20,810 без да се ѕиркаа околу инвеститорот Хром 221 00:10:20,810 --> 00:10:24,010 алатки во спротивно clunkier интерфејс. 222 00:10:24,010 --> 00:10:29,099