1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 Spreker: Laten we nu duik in de verdeelsleutel 3 00:00:11,730 --> 00:00:14,470 en neem een ​​kijkje op de context waarin de code die u schrijft 4 00:00:14,470 --> 00:00:15,780 zal opereren. 5 00:00:15,780 --> 00:00:17,350 Aan het einde van de dag, je gaat implementeren 6 00:00:17,350 --> 00:00:18,710 het geheel van de webserver. 7 00:00:18,710 --> 00:00:20,460 Maar we hebben verstrekt u met het skelet 8 00:00:20,460 --> 00:00:24,090 code dat sommige functies hebben, in het bijzonder met betrekking tot netwerken. 9 00:00:24,090 --> 00:00:25,390 Laten we eens een kijkje nemen. 10 00:00:25,390 --> 00:00:27,560 >> Dus hier naar de top van het bestand is een bos 11 00:00:27,560 --> 00:00:30,020 van functie te testen macro-eisen. 12 00:00:30,020 --> 00:00:33,570 Nu is dit slechts een kenmerk van c, waarbij volgens een bos van man pagina's 13 00:00:33,570 --> 00:00:36,410 moet je een aantal van definiëren Deze constanten om waar te 14 00:00:36,410 --> 00:00:39,920 of zelfs specifieke nummers, zodat zijn heeft u toegang tot bepaalde functies. 15 00:00:39,920 --> 00:00:42,470 Anders zullen ze worden zwartwerk en je zal geen toegang hebben. 16 00:00:42,470 --> 00:00:45,340 Dus ik heb dit gedaan door middel van het lezen van de man pagina's. 17 00:00:45,340 --> 00:00:48,410 Nu beneden, in lijnen 15 tot 17, we 18 00:00:48,410 --> 00:00:50,550 hebben een hele hoop beperkingen verklaard. 19 00:00:50,550 --> 00:00:53,370 >> En we hebben deze van een geleende populaire webserver genaamd Apache. 20 00:00:53,370 --> 00:00:54,650 En dit zijn slechts nummers die gaan 21 00:00:54,650 --> 00:00:56,810 het totale aantal cap bytes die zijn toegestaan 22 00:00:56,810 --> 00:01:01,930 in verschillende contexten voor de HTTP verzoek dat een browser is toegestaan ​​om mij te sturen. 23 00:01:01,930 --> 00:01:04,310 Vervolgens definiëren we octetten. 24 00:01:04,310 --> 00:01:07,790 Nu een octet is gewoon een mooie manier zeggen een byte, of acht bits. 25 00:01:07,790 --> 00:01:10,720 Blijkt dat in vervlogen tijden een byte niet noodzakelijk acht bits, 26 00:01:10,720 --> 00:01:12,339 dus octet is altijd acht bits. 27 00:01:12,339 --> 00:01:14,880 Dus in dit geval hebben we aangenomen wat is gebruikelijk in de netwerken 28 00:01:14,880 --> 00:01:17,410 wereld van het aanroepen van acht bytes een octet. 29 00:01:17,410 --> 00:01:21,840 >> Hier heb ik aangegeven dat achttallen zal 512, zo veel als in forensisch 30 00:01:21,840 --> 00:01:24,170 als we lezen een heleboel bytes tegelijk ook hier 31 00:01:24,170 --> 00:01:27,390 we gaan naar een gelezen tros octetten tegelijk. 32 00:01:27,390 --> 00:01:28,922 Naast een hele hoop van header-bestanden. 33 00:01:28,922 --> 00:01:30,255 Hoe wist ik dat deze op te nemen? 34 00:01:30,255 --> 00:01:32,730 Nou ik lees gewoon de man pagina's voor een aantal functies 35 00:01:32,730 --> 00:01:35,620 dat we zullen gebruiken in deze distributie code en omvatten in degenen 36 00:01:35,620 --> 00:01:37,390 Ik kreeg de opdracht om. 37 00:01:37,390 --> 00:01:39,090 >> En nu hebben we een soort data. 38 00:01:39,090 --> 00:01:41,470 We hebben een octet verklaard om een ​​char zijn. 39 00:01:41,470 --> 00:01:44,040 En we zullen later zien dat dat is gebruikt in de code. 40 00:01:44,040 --> 00:01:45,670 En we hebben verklaard hele hoop van prototypes, 41 00:01:45,670 --> 00:01:47,961 en we zullen snel lopen door elk van deze functies. 42 00:01:47,961 --> 00:01:50,400 Ten slotte, en misschien wel het meest belangrijk te houden 43 00:01:50,400 --> 00:01:52,520 let op dit punt in het verhaal, dat er 44 00:01:52,520 --> 00:01:54,520 in feite geheel bos van globale variabelen 45 00:01:54,520 --> 00:02:00,430 het begin van het bestand, wortel, CFD, SFD, verzoek, file en lichaam. 46 00:02:00,430 --> 00:02:03,960 >> Nu algemeen gebruik zoveel globale variabelen, of globale variabelen helemaal, 47 00:02:03,960 --> 00:02:05,280 is niet de rug praktijk. 48 00:02:05,280 --> 00:02:09,090 Maar het blijkt dat we ook met behulp van een techniek genaamd signaalverwerking later 49 00:02:09,090 --> 00:02:11,930 in de code, die ons in staat stelt om detecteren wanneer de gebruiker er iets raakt 50 00:02:11,930 --> 00:02:15,080 zoals CTRL C en af ​​te sluiten de server sierlijk. 51 00:02:15,080 --> 00:02:18,240 En om sierlijk doen en eigenlijk vrij geheugen, 52 00:02:18,240 --> 00:02:20,800 we nodig hebben om toegang te hebben deze globale variabelen. 53 00:02:20,800 --> 00:02:24,510 >> En laten we nu eens een kijkje nemen op de belangrijkste, die drijft het geheel van dit programma. 54 00:02:24,510 --> 00:02:27,720 Eerst op hier boven we heb een fout nummer variabele 55 00:02:27,720 --> 00:02:29,570 dat lijkt niet te een type, maar dat is 56 00:02:29,570 --> 00:02:31,500 want het is eigenlijk gedefinieerd in een bestand genaamd 57 00:02:31,500 --> 00:02:34,800 error errno.h die inbegrepen hoger. 58 00:02:34,800 --> 00:02:38,780 Als je dat doet de mens errno om daadwerkelijk zie de definitie van dit ding, 59 00:02:38,780 --> 00:02:41,230 je zult zien dat dit een speciale globale variabele dat 60 00:02:41,230 --> 00:02:43,350 wordt door een hele hoop te stellen van functies niet geschreven 61 00:02:43,350 --> 00:02:48,730 door ons, maar door de auteurs van Linux en andere systemen daadwerkelijk vastgesteld 62 00:02:48,730 --> 00:02:52,400 een nummer om die variabele wanneer er iets mis gaat, zodat u kunt wereldwijd 63 00:02:52,400 --> 00:02:54,830 erachter te komen wat deed fout gaan. 64 00:02:54,830 --> 00:02:58,540 >> Nu beneden zie je een nieuwe techniek wellicht met behulp van getopt, 65 00:02:58,540 --> 00:03:01,790 een functie die parse commando helpt line argumenten, zodat we niet 66 00:03:01,790 --> 00:03:05,540 hoeft te storen verspillen tijd uitzoeken hoe om iets te ontleden, zoals 8080, 67 00:03:05,540 --> 00:03:08,350 of dash p, of dash h om hulp te krijgen. 68 00:03:08,350 --> 00:03:10,300 getopt doet in wezen dat voor ons. 69 00:03:10,300 --> 00:03:11,750 Zie de man pagina voor meer. 70 00:03:11,750 --> 00:03:13,960 >> Vervolgens een beetje fout doen wij controleren om ervoor te zorgen 71 00:03:13,960 --> 00:03:17,420 dat het poortnummer is binnen het opgegeven bereik in de spec. 72 00:03:17,420 --> 00:03:20,240 Vervolgens zien we een aanroep van de functie start, waarvan de definitie zullen we 73 00:03:20,240 --> 00:03:24,040 kijken in een moment, en zoals de naam suggereert, dit begint de webserver. 74 00:03:24,040 --> 00:03:26,960 Hier hebben we een oproep naar een functie genoemd signaal dat zegt, 75 00:03:26,960 --> 00:03:30,750 als en wanneer je hoort Controle C uit toetsenbord van de gebruiker, ga je gang en bel 76 00:03:30,750 --> 00:03:34,650 een functie genaamd handler dat gaat om uiteindelijk schone dingen en stoppen 77 00:03:34,650 --> 00:03:35,500 de server. 78 00:03:35,500 --> 00:03:39,470 >> Onder dat is wat lijkt op een te zijn oneindige lus, de eerste regel van die 79 00:03:39,470 --> 00:03:41,660 effectief is een oproep een functie genaamd 80 00:03:41,660 --> 00:03:45,110 reset, die onszelf implementeren later in orde 81 00:03:45,110 --> 00:03:47,470 vrij te maken wat van onze wereldwijde staten. 82 00:03:47,470 --> 00:03:50,480 Daarna is een lijn van code die voorwaardelijk 83 00:03:50,480 --> 00:03:52,576 controleert het rendement waarde van de aangesloten. 84 00:03:52,576 --> 00:03:55,700 Nu verbonden ziet eruit als een predikaat, iets dat waar of onwaar terugkeert. 85 00:03:55,700 --> 00:03:58,040 En het doet, maar er is iets speciaals in de aangesloten 86 00:03:58,040 --> 00:03:59,960 doordat het een blokkeringsoproep. 87 00:03:59,960 --> 00:04:03,180 Het zal daar te zitten en te wachten totdat de browser van een gebruiker 88 00:04:03,180 --> 00:04:05,860 probeert te maken met deze web server en alleen dan zal het 89 00:04:05,860 --> 00:04:10,160 return true of false zodat we doorgaan aan de binnenkant van deze if-statement. 90 00:04:10,160 --> 00:04:13,870 >> Eenmaal daar, merkt deze functie om een functie genaamd parse, die we schreven, 91 00:04:13,870 --> 00:04:17,230 die alle octetten ontleedt, alle van de bytes vanuit een browser 92 00:04:17,230 --> 00:04:21,010 naar de server, zodat we kunnen overhandigen je terug uiteindelijk een waarde op één 93 00:04:21,010 --> 00:04:24,420 van de globale variabelen die slaat alle bytes in slechts 94 00:04:24,420 --> 00:04:26,630 de headers van die verzoek niet het lichaam 95 00:04:26,630 --> 00:04:28,920 als er echter een orgaan aan. 96 00:04:28,920 --> 00:04:32,980 >> Nu beneden beginnen we te ontleden die headers te extraheren 97 00:04:32,980 --> 00:04:35,490 een subset van de informatie dat we de zorg over. 98 00:04:35,490 --> 00:04:37,740 Specifiek, volgens de specificatie, hebben we eerst 99 00:04:37,740 --> 00:04:40,580 wilde vragen lijn, dat is gewoon die eerste lijn die 100 00:04:40,580 --> 00:04:45,710 hopelijk zegt iets als get slash of een pad en vervolgens HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 We gebruiken deze metafoor van een naald in een hooiberg 102 00:04:48,150 --> 00:04:50,370 om te zoeken naar bepaalde chars of adressen. 103 00:04:50,370 --> 00:04:53,120 En inderdaad, er is een aantal functies in onze distributie-code 104 00:04:53,120 --> 00:04:56,930 dat je ook kan nuttig vinden bij het zoeken naar bepaalde waarden. 105 00:04:56,930 --> 00:05:00,630 >> Uiteindelijk, kopiëren we deze bytes in een variabele genaamd lijn, 106 00:05:00,630 --> 00:05:03,510 die opmerken, ook, we hebben op de stapel toegewezen 107 00:05:03,510 --> 00:05:05,890 door middel van een dynamisch formaat array. 108 00:05:05,890 --> 00:05:08,350 En we bewust proberen om te voorkomen dat bellen malloc 109 00:05:08,350 --> 00:05:11,100 omdat opnieuw, omdat of Control C zijn 110 00:05:11,100 --> 00:05:14,630 een potentiële Deze activiteit, we niet willen deze code plotseling 111 00:05:14,630 --> 00:05:17,479 onderbroken door de gebruiker hitting Controle C, waarvan het resultaat 112 00:05:17,479 --> 00:05:20,270 is dat ik geen kans zou kunnen hebben gratis iets wat ik heb malloced. 113 00:05:20,270 --> 00:05:23,660 Dus ik ben op zoek naar zo veel gebruiken van de stapel is ik kan hier. 114 00:05:23,660 --> 00:05:26,040 >> Next up, een hele hoop te dos. 115 00:05:26,040 --> 00:05:28,930 De specificatie zal uiteenzetten Op precies wat hier verwacht, 116 00:05:28,930 --> 00:05:31,800 maar de opmerkingen geven u een hint van wat ons te wachten. 117 00:05:31,800 --> 00:05:33,830 Je moet eerst valideert het verzoek lijn 118 00:05:33,830 --> 00:05:37,760 en zorg ervoor dat het lijkt alsof de specificaties grammatica, zogezegd, 119 00:05:37,760 --> 00:05:38,541 zegt het zou moeten. 120 00:05:38,541 --> 00:05:41,290 Vervolgens moet er iets te halen riep de query, het spul uit 121 00:05:41,290 --> 00:05:44,200 na een vraagteken, zoals we zagen met onze Google voorbeeld 122 00:05:44,200 --> 00:05:46,320 terloops in een HD parameter. 123 00:05:46,320 --> 00:05:49,050 Vervolgens hebben we samenvoegen samen de root van de webserver 124 00:05:49,050 --> 00:05:52,520 met het pad dat is in dat het verzoek van de eerste lijn 125 00:05:52,520 --> 00:05:56,010 en vormen het volledige pad van het bestand willen we op zoek naar. 126 00:05:56,010 --> 00:06:00,300 >> Daarna gaan we ervoor zorgen dat dat het bestand bestaat en leesbaar. 127 00:06:00,300 --> 00:06:05,100 En dan gaan we halen haar bestandsextensie, de .html of .php, 128 00:06:05,100 --> 00:06:09,920 of een dergelijke uitbreiding is dat bij de einde van de gevraagde string. 129 00:06:09,920 --> 00:06:11,940 Next up is een hele stelletje code schreven we 130 00:06:11,940 --> 00:06:15,800 om daadwerkelijk te genereren PHP generated content voor je. 131 00:06:15,800 --> 00:06:18,010 In een notendop, dit code neemt in de naam 132 00:06:18,010 --> 00:06:20,250 van het bestand dat u wilt PHP te interpreteren. 133 00:06:20,250 --> 00:06:24,630 We doorgeven via het zogeheten een buis in PHP interpreter. 134 00:06:24,630 --> 00:06:28,060 Ga terug het antwoord alsof de reactie waren bestand zelf. 135 00:06:28,060 --> 00:06:32,110 En dan herhalen we over die file's bytes, ze allemaal in een buffer te trekken 136 00:06:32,110 --> 00:06:34,180 zodat we uiteindelijk print ze uit. 137 00:06:34,180 --> 00:06:37,230 >> Inderdaad, al deze vraagt ​​hier om dprintf 138 00:06:37,230 --> 00:06:40,110 stelt ons in staat om iets af te drukken zogenaamde file descriptor, die 139 00:06:40,110 --> 00:06:42,350 is gewoon een integer dat is een bestand. 140 00:06:42,350 --> 00:06:45,360 Zeer vergelijkbaar in de geest, maar fundamenteel verschillend van een bestand 141 00:06:45,360 --> 00:06:46,620 ster pointer. 142 00:06:46,620 --> 00:06:50,260 Merk op hoe je syntax kunt gebruiken als printf hier zodat ik kan dynamisch 143 00:06:50,260 --> 00:06:54,000 Steek iets als de lengte de waarde van een HTTP header 144 00:06:54,000 --> 00:06:55,270 genaamd Content-Length. 145 00:06:55,270 --> 00:06:57,990 En uiteindelijk heb ik de functie recht om daadwerkelijk te schrijven 146 00:06:57,990 --> 00:07:00,040 het lichaam om het verzoek. 147 00:07:00,040 --> 00:07:03,750 >> Helaas, wij slechts geïmplementeerd ondersteuning voor dynamisch 148 00:07:03,750 --> 00:07:05,350 gegenereerde PHP-bestanden. 149 00:07:05,350 --> 00:07:08,520 We hadden geen ondersteuning voor de uitvoering van statische bestanden zoals gifs, en JPEG, 150 00:07:08,520 --> 00:07:10,660 en CSS en HTML-bestanden. 151 00:07:10,660 --> 00:07:14,450 Dat, helaas, wordt overgelaten aan u om te reageren op de klant doel 152 00:07:14,450 --> 00:07:15,090 dit te doen. 153 00:07:15,090 --> 00:07:20,050 Dus daar zul je merken dat er niet veel inspiratie binnen dat blok, 154 00:07:20,050 --> 00:07:23,520 maar als je een beetje hoger op hoe we gingen over het interpreteren van PHP-code, 155 00:07:23,520 --> 00:07:25,520 de functies die u zult gebruiken zijn een beetje anders. 156 00:07:25,520 --> 00:07:27,561 >> In feite kan je lenen Sommige functies 157 00:07:27,561 --> 00:07:29,620 misschien van het forensisch onderzoek probleem set, omdat 158 00:07:29,620 --> 00:07:32,860 aan het eind van de dag alles wat je nodig hebt om hier doen is als je eenmaal weet wat het bestand geopend 159 00:07:32,860 --> 00:07:35,690 en als je eenmaal weet dat het zogenaamde MIME-type of content type, 160 00:07:35,690 --> 00:07:39,040 je nodig hebt om te lezen in die bytes en hoe dan spugen ze weer naar buiten. 161 00:07:39,040 --> 00:07:41,190 >> En nu een rondleiding van deze andere functies bestand. 162 00:07:41,190 --> 00:07:43,820 Up voor het eerst wordt aangesloten, die gewoon geeft true 163 00:07:43,820 --> 00:07:47,350 toen het eindelijk hoort een verbinding van een gebruiker. 164 00:07:47,350 --> 00:07:48,786 Next up is fout. 165 00:07:48,786 --> 00:07:52,296 Error ondertussen als functie we schreef aan alle van de verschillende 400 behandelen 166 00:07:52,296 --> 00:07:55,360 en 500 HTTP-status codes die je zou willen 167 00:07:55,360 --> 00:07:58,500 terug te sturen naar de gebruiker, samen met een standaard bericht. 168 00:07:58,500 --> 00:08:01,950 >> Next up is de belasting, een bijzonder vlezige functie, waarvan het doel in het leven 169 00:08:01,950 --> 00:08:06,920 is te lezen uit een bestand ster pointer de inhoud van een bestand in een globale buffer 170 00:08:06,920 --> 00:08:09,000 dat hebben wij verklaard wereldwijd boven [? belangrijkste. ?] 171 00:08:09,000 --> 00:08:12,649 Dit is een beetje ingewikkeld, omdat we moet de bytes gelezen uit het bestand 172 00:08:12,649 --> 00:08:14,690 maar controleren op elke iteratie of we hebben al 173 00:08:14,690 --> 00:08:17,600 raakte het einde van het bestand of de iets anders is misgegaan. 174 00:08:17,600 --> 00:08:21,210 En we gebruiken realloc om ervoor te zorgen dat wat de buffer we gebruiken groeit 175 00:08:21,210 --> 00:08:24,440 en groeit en groeit en altijd voorblijven van het aantal bytes 176 00:08:24,440 --> 00:08:25,675 die we nodig hebben om te passen in daar. 177 00:08:25,675 --> 00:08:27,550 Handler, ondertussen, is de functie die wordt 178 00:08:27,550 --> 00:08:30,630 genoemd bij wijze van het hebben geregistreerd Controle C als een signaal 179 00:08:30,630 --> 00:08:32,140 dat we willen onderscheppen. 180 00:08:32,140 --> 00:08:34,070 Merk hier in handler dat het uiteindelijk 181 00:08:34,070 --> 00:08:36,780 oproepen te stoppen, wat natuurlijk stopt de webserver. 182 00:08:36,780 --> 00:08:39,750 En helaas, lookup is niet geïmplementeerd. 183 00:08:39,750 --> 00:08:41,940 In de geest, dit is een vrij eenvoudig functie. 184 00:08:41,940 --> 00:08:44,900 Gegeven een extensie, moet om terug zogenaamde MIME 185 00:08:44,900 --> 00:08:46,320 type of content type. 186 00:08:46,320 --> 00:08:49,260 En we geven in de specificatie Wat dat mapping moet zijn. 187 00:08:49,260 --> 00:08:52,330 Maar je moet vertalen het uiteindelijk om C-code. 188 00:08:52,330 --> 00:08:56,490 >> Next up is onze evenzo vlezige functie riep parse, waarvan het doel in het leven 189 00:08:56,490 --> 00:08:59,350 te lezen, niet uit een bestand, maar van een netwerkverbinding. 190 00:08:59,350 --> 00:09:03,510 Specifiek, lezen en ontleden van de HTTP-verzoek dat is gekomen vanuit een browser 191 00:09:03,510 --> 00:09:05,940 de server zodat Uiteindelijk kunnen we ontleden 192 00:09:05,940 --> 00:09:09,530 bij enkel de headers in het verzoek lijn en terug te keren die aan u 193 00:09:09,530 --> 00:09:12,720 door middel van een globale buffer die we hierboven [verklaard? belangrijkste. ?] 194 00:09:12,720 --> 00:09:14,880 >> Reset, ondertussen, is een functie definiëren we 195 00:09:14,880 --> 00:09:18,730 dat wordt iteratief binnen genoemd van de belangrijkste elke keer dat je over 196 00:09:18,730 --> 00:09:20,799 klaar om te beginnen met luisteren een nieuwe verbinding 197 00:09:20,799 --> 00:09:22,840 zodat we weten altijd de toestand van onze variabelen 198 00:09:22,840 --> 00:09:24,870 en zo dat we hebben ook bevrijd elke geheugen dat 199 00:09:24,870 --> 00:09:28,070 misschien zijn toegewezen voor een eerdere netwerkverbinding. 200 00:09:28,070 --> 00:09:30,060 Next up wil beginnen, de functie die we schreven 201 00:09:30,060 --> 00:09:31,920 dat geheel bevat Veel netwerken code 202 00:09:31,920 --> 00:09:34,420 die uiteindelijk begint de webserver. 203 00:09:34,420 --> 00:09:36,680 >> Laatste up is de functie genoemd stop, die 204 00:09:36,680 --> 00:09:38,770 doet precies dat, het stopt de webserver. 205 00:09:38,770 --> 00:09:42,270 Maar eerst is het bevrijdt elke geheugen dat nog steeds is toegewezen. 206 00:09:42,270 --> 00:09:45,850 Maar het uiteindelijk noemt exit zonder zelfs terugkerende controle 207 00:09:45,850 --> 00:09:47,480 om onze functie. 208 00:09:47,480 --> 00:09:49,480 Uiteindelijk een van de belangrijkste technieken 209 00:09:49,480 --> 00:09:52,680 bij de uitvoering van deze web-server is ga een beetje trial and error, 210 00:09:52,680 --> 00:09:55,886 het hebben van een browservenster geopend aan de rechterkant en een terminal venster op 211 00:09:55,886 --> 00:09:57,760 links, de servers console venster, zodat u 212 00:09:57,760 --> 00:10:00,420 kan de berichten die te zien op het scherm wordt weergegeven. 213 00:10:00,420 --> 00:10:04,170 >> Maar nog beter zou een derde zijn raam, een tweede terminal venster, 214 00:10:04,170 --> 00:10:07,135 waarin u Telnet, het gebruik gebruiken voor die is voorgeschreven in de spec. 215 00:10:07,135 --> 00:10:09,640 En Telnet is gewoon een zeer eenvoudig programma voor het netwerk 216 00:10:09,640 --> 00:10:12,660 dat kun je doen alsof zijn een browser in één venster 217 00:10:12,660 --> 00:10:14,540 terwijl het spreken aan het andere venster. 218 00:10:14,540 --> 00:10:16,830 Op deze manier kunt u zien precies de tekstuele commando's 219 00:10:16,830 --> 00:10:18,700 die terug komen van server naar client 220 00:10:18,700 --> 00:10:20,810 zonder te porren rond ontwikkelaar chroom's 221 00:10:20,810 --> 00:10:24,010 gereedschappen in een anders clunkier interface. 222 00:10:24,010 --> 00:10:29,099