1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 ALTAVEU: Ara anem a bussejar en el codi de distribució 3 00:00:11,730 --> 00:00:14,470 i fer una ullada al context en què el codi que escriure 4 00:00:14,470 --> 00:00:15,780 que es va a operar. 5 00:00:15,780 --> 00:00:17,350 Al final del dia, vostè va a posar en pràctica 6 00:00:17,350 --> 00:00:18,710 la totalitat del servidor web. 7 00:00:18,710 --> 00:00:20,460 Però hem proporcionat que amb l'esquelet 8 00:00:20,460 --> 00:00:24,090 codi que té algunes funcions, particularment en relació amb la creació de xarxes. 9 00:00:24,090 --> 00:00:25,390 Anem a fer una ullada. 10 00:00:25,390 --> 00:00:27,560 >> Així que aquí cap a la part superior del fitxer és un grapat 11 00:00:27,560 --> 00:00:30,020 de la funció de provar els requisits de macro. 12 00:00:30,020 --> 00:00:33,570 Ara bé, això és només una característica de c, segons el qual d'acord amb un munt de pàgines de manual 13 00:00:33,570 --> 00:00:36,410 vostè ha de definir algunes de aquestes constants per ser veritat 14 00:00:36,410 --> 00:00:39,920 o ser fins i tot números específics de manera que vostè té accés a certes funcions. 15 00:00:39,920 --> 00:00:42,470 En cas contrari seran no declarada i vostè no tindrà accés. 16 00:00:42,470 --> 00:00:45,340 Així que he fet això per mitjà de la lectura de les pàgines de manual. 17 00:00:45,340 --> 00:00:48,410 Ara baix, en les línies 15 i 17, que 18 00:00:48,410 --> 00:00:50,550 tenen un munt de límits declarats. 19 00:00:50,550 --> 00:00:53,370 >> I hem prestat aquests d'una servidor web popular anomenat Apache. 20 00:00:53,370 --> 00:00:54,650 I aquests són només nombres que es va 21 00:00:54,650 --> 00:00:56,810 per limitar el nombre total de bytes que es permet 22 00:00:56,810 --> 00:01:01,930 en els diversos contextos de la petició HTTP que permet a un navegador d'enviar. 23 00:01:01,930 --> 00:01:04,310 A continuació, definim octets. 24 00:01:04,310 --> 00:01:07,790 Ara un octet és només una forma elegant de dir un byte, o vuit bits. 25 00:01:07,790 --> 00:01:10,720 Resulta que en antany un byte no era necessàriament vuit bits 26 00:01:10,720 --> 00:01:12,339 de manera octet és sempre vuit bits. 27 00:01:12,339 --> 00:01:14,880 Així que en aquest cas hem adoptat el que és comú a la xarxa 28 00:01:14,880 --> 00:01:17,410 món de cridar a vuit bytes d'un octet. 29 00:01:17,410 --> 00:01:21,840 >> Aquí he especificat que octets voluntat ser de 512, de manera que igual que en l'anàlisi forense 30 00:01:21,840 --> 00:01:24,170 quan llegim un munt de bytes alhora, també en aquest cas, 31 00:01:24,170 --> 00:01:27,390 anem a llegir un manat de octets alhora. 32 00:01:27,390 --> 00:01:28,922 Següent un munt d'arxius de capçalera. 33 00:01:28,922 --> 00:01:30,255 Com sé que inclogui aquests? 34 00:01:30,255 --> 00:01:32,730 Bé, jo simplement vaig llegir l'home pàgines per a un nombre de funcions 35 00:01:32,730 --> 00:01:35,620 que utilitzarem en aquesta distribució codi i incloure en els 36 00:01:35,620 --> 00:01:37,390 Em va donar instruccions per. 37 00:01:37,390 --> 00:01:39,090 >> I ara tenim un tipus de dades. 38 00:01:39,090 --> 00:01:41,470 Hem declarat un octeto per ser un char. 39 00:01:41,470 --> 00:01:44,040 I veurem més endavant que això és utilitzat en tot el codi. 40 00:01:44,040 --> 00:01:45,670 I hem declarat una manat sencer de prototips, 41 00:01:45,670 --> 00:01:47,961 i anem a caminar ràpidament per cadascuna d'aquestes funcions. 42 00:01:47,961 --> 00:01:50,400 Finalment, i potser el més important tenir en 43 00:01:50,400 --> 00:01:52,520 la ment en aquest moment de la història, és que no 44 00:01:52,520 --> 00:01:54,520 són, de fet el seu conjunt munt de variables globals 45 00:01:54,520 --> 00:02:00,430 a la part superior de l'arxiu, arrel, CFD, SFD, sol·licitud, arxiu i el cos. 46 00:02:00,430 --> 00:02:03,960 >> Ara generalment, utilitzant tants mundial variables o variables globals en absolut, 47 00:02:03,960 --> 00:02:05,280 no és la pràctica de nou. 48 00:02:05,280 --> 00:02:09,090 Però resulta que també estem utilitzant un tècnica anomenada maneig de senyals més tard 49 00:02:09,090 --> 00:02:11,930 en el codi, el que ens permet detectar quan l'usuari prem una mica 50 00:02:11,930 --> 00:02:15,080 com CTRL C i es tancarà el servidor amb gràcia. 51 00:02:15,080 --> 00:02:18,240 I per tal de fer això amb gràcia i en realitat alliberar memòria, 52 00:02:18,240 --> 00:02:20,800 necessitem tenir accés a aquestes variables globals. 53 00:02:20,800 --> 00:02:24,510 >> I ara anem a fer una ullada a principal, que impulsa la totalitat d'aquest programa. 54 00:02:24,510 --> 00:02:27,720 En primer lloc, a la part superior aquí tenir una variable de nombre d'error 55 00:02:27,720 --> 00:02:29,570 que sembla no tenir un tipus, però això és 56 00:02:29,570 --> 00:02:31,500 perquè en realitat definit en un arxiu anomenat 57 00:02:31,500 --> 00:02:34,800 errno.h error que s'inclou més amunt. 58 00:02:34,800 --> 00:02:38,780 Si ho fa l'home errno a realitat vegeu la definició d'aquesta cosa, 59 00:02:38,780 --> 00:02:41,230 veuràs que es tracta d'un variable global especial que 60 00:02:41,230 --> 00:02:43,350 és fixat per un grapat sencer de funcions no escrita 61 00:02:43,350 --> 00:02:48,730 per nosaltres, sinó pels autors de Linux i altres sistemes per establir realment 62 00:02:48,730 --> 00:02:52,400 un nombre a aquesta variable quan alguna cosa va malament, perquè pugui a nivell mundial 63 00:02:52,400 --> 00:02:54,830 esbrinar el que va sortir malament. 64 00:02:54,830 --> 00:02:58,540 >> Ara baix veuràs una nova tècnica potser usant getopt, 65 00:02:58,540 --> 00:03:01,790 una funció que ajuda comando d'anàlisi sintàctica arguments de la línia perquè no ens fem 66 00:03:01,790 --> 00:03:05,540 s'ha de preocupar de perdre el temps pensant la manera d'analitzar una mena 8080, 67 00:03:05,540 --> 00:03:08,350 o un guió p, o un guió h per obtenir ajuda. 68 00:03:08,350 --> 00:03:10,300 getopt bàsicament fa que per a nosaltres. 69 00:03:10,300 --> 00:03:11,750 Consulteu la pàgina de manual per a més. 70 00:03:11,750 --> 00:03:13,960 >> A continuació, fem una mica d'error comprovació per assegurar- 71 00:03:13,960 --> 00:03:17,420 que el nombre de port està dins del rang especificat en l'especificació. 72 00:03:17,420 --> 00:03:20,240 A continuació, veiem una crida a la funció iniciar, la definició ens va 73 00:03:20,240 --> 00:03:24,040 mira en un moment, i com el seu nom suggereix, aquest s'inicia el servidor web. 74 00:03:24,040 --> 00:03:26,960 Aquí tenim una crida a una funció crida senyal que diu: 75 00:03:26,960 --> 00:03:30,750 sempre que escolti Control C de teclat de l'usuari, seguiu endavant i truqui 76 00:03:30,750 --> 00:03:34,650 un controlador de funció trucada que està passant el que en última instància, netes i deixar de 77 00:03:34,650 --> 00:03:35,500 el servidor. 78 00:03:35,500 --> 00:03:39,470 >> A sota d'això és el que sembla ser un bucle infinit, la primera línia dels quals 79 00:03:39,470 --> 00:03:41,660 efectivament és una crida a una funció anomenada 80 00:03:41,660 --> 00:03:45,110 restablir, que nosaltres mateixos aplicar més endavant per tal 81 00:03:45,110 --> 00:03:47,470 per alliberar alguns dels nostres estats globals. 82 00:03:47,470 --> 00:03:50,480 Després que és una línia de codi que condicionalment 83 00:03:50,480 --> 00:03:52,576 està comprovant el retorn valor de connectat. 84 00:03:52,576 --> 00:03:55,700 Mirades Ara connectats com un predicat, cosa que retorna cert o fals. 85 00:03:55,700 --> 00:03:58,040 I ho fa, però hi ha alguna cosa especial en connectat 86 00:03:58,040 --> 00:03:59,960 en què es tracta d'una trucada de bloqueig. 87 00:03:59,960 --> 00:04:03,180 Serà seure allà i esperar fins que el navegador de l'usuari 88 00:04:03,180 --> 00:04:05,860 intenta connectar-se a aquest web servidor i només llavors serà 89 00:04:05,860 --> 00:04:10,160 return true o false perquè procedim a l'interior d'aquesta sentència if. 90 00:04:10,160 --> 00:04:13,870 >> Un cop allà, observi aquesta funció a un funció anomenada d'anàlisi, el que escrivim, 91 00:04:13,870 --> 00:04:17,230 que analitza tots els octets, tot dels bytes procedents d'un navegador 92 00:04:17,230 --> 00:04:21,010 per al servidor, de manera que podem lliurar de tornada a última instància, un valor a un 93 00:04:21,010 --> 00:04:24,420 d'aquestes variables globals que emmagatzema tots els bytes en només 94 00:04:24,420 --> 00:04:26,630 les capçaleres d'aquest sol·licitud, no el cos 95 00:04:26,630 --> 00:04:28,920 si no eren en realitat un cos a la mateixa. 96 00:04:28,920 --> 00:04:32,980 >> Ara baix comencem a analitzar les capçaleres per extreure 97 00:04:32,980 --> 00:04:35,490 un subconjunt de la informació que ens preocupem. 98 00:04:35,490 --> 00:04:37,740 Específicament, per la especificació, nosaltres primer 99 00:04:37,740 --> 00:04:40,580 volia demanar línia, que és només que molt primera línia que 100 00:04:40,580 --> 00:04:45,710 esperem que diu alguna cosa així com get reduir o algun camí i després HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Estem utilitzant aquesta metàfora d'una agulla en un paller 102 00:04:48,150 --> 00:04:50,370 buscar en particular caràcters o adreces. 103 00:04:50,370 --> 00:04:53,120 I de fet, hi ha un nombre de funcions en el nostre codi de distribució 104 00:04:53,120 --> 00:04:56,930 que vostè, també, pot ser que trobeu en la recerca de valors particulars. 105 00:04:56,930 --> 00:05:00,630 >> En última instància, copiem aquests bytes en una línia de variable anomenada, 106 00:05:00,630 --> 00:05:03,510 que notem, també, tenim assignat a la pila 107 00:05:03,510 --> 00:05:05,890 per mitjà d'una matriu de mida dinàmic. 108 00:05:05,890 --> 00:05:08,350 I estem tractant deliberadament per evitar cridar a malloc 109 00:05:08,350 --> 00:05:11,100 perquè, de nou, perquè de Control C sent 110 00:05:11,100 --> 00:05:14,630 una possible opció d'aquest programa, no vull tenir aquest codi de sobte 111 00:05:14,630 --> 00:05:17,479 interromput pels cops d'usuari Control C, el resultat dels quals 112 00:05:17,479 --> 00:05:20,270 és que jo no podria tenir una oportunitat per a alguna cosa gratis que he malloced. 113 00:05:20,270 --> 00:05:23,660 Així que estic tractant d'usar tant de la pila és el que pugui aquí. 114 00:05:23,660 --> 00:05:26,040 >> El següent, un munt de dos. 115 00:05:26,040 --> 00:05:28,930 L'especificació exposarà exactament el que s'espera aquí, 116 00:05:28,930 --> 00:05:31,800 però els comentaris que donen una pista del que està per venir. 117 00:05:31,800 --> 00:05:33,830 Primer ha de validar la línia de petició 118 00:05:33,830 --> 00:05:37,760 i assegureu-vos que sembla que el especificacions gramàtica, per així dir-ho, 119 00:05:37,760 --> 00:05:38,541 diu que hauria. 120 00:05:38,541 --> 00:05:41,290 A continuació, extreure alguna cosa anomenat la consulta, la matèria cap a fora 121 00:05:41,290 --> 00:05:44,200 després d'un signe d'interrogació, com vam veure amb el nostre exemple Google 122 00:05:44,200 --> 00:05:46,320 de passada en un paràmetre HD. 123 00:05:46,320 --> 00:05:49,050 Després es concatena junts l'arrel del servidor web 124 00:05:49,050 --> 00:05:52,520 amb la ruta que està en aquesta primera línia de petició 125 00:05:52,520 --> 00:05:56,010 i formar la ruta completa l'arxiu que volem cercar. 126 00:05:56,010 --> 00:06:00,300 >> Després d'això, anem a fer que l'arxiu existeix i és llegible. 127 00:06:00,300 --> 00:06:05,100 I després anem a extreure el seu extensió d'arxiu, els arxius .html o .php la, 128 00:06:05,100 --> 00:06:09,920 o alguna extensió que està en el final de la cadena sol·licitada. 129 00:06:09,920 --> 00:06:11,940 El següent és un tot munt de codi que escrivim 130 00:06:11,940 --> 00:06:15,800 per generar realment PHP contingut per a vostè generat. 131 00:06:15,800 --> 00:06:18,010 En poques paraules, aquesta codi pren al nom 132 00:06:18,010 --> 00:06:20,250 del fitxer que voleu PHP interpretar. 133 00:06:20,250 --> 00:06:24,630 Nosaltres vam passar per una cosa anomenada un tub en l'intèrpret de PHP. 134 00:06:24,630 --> 00:06:28,060 Torna la resposta com si la resposta fos un arxiu en si mateix. 135 00:06:28,060 --> 00:06:32,110 I després iterem sobre aquest arxiu de bytes, tirant tots en un memòria intermèdia 136 00:06:32,110 --> 00:06:34,180 pel que podem en última instància imprimir-los. 137 00:06:34,180 --> 00:06:37,230 >> De fet, tots aquests demana aquí per dprintf 138 00:06:37,230 --> 00:06:40,110 ens permet imprimir alguna cosa anomenat un descriptor d'arxiu, que 139 00:06:40,110 --> 00:06:42,350 és simplement un sencer que representa un arxiu. 140 00:06:42,350 --> 00:06:45,360 Molt similar en esperit, però fonamentalment diferent d'un arxiu 141 00:06:45,360 --> 00:06:46,620 indicador de l'estrella. 142 00:06:46,620 --> 00:06:50,260 Observeu com es pot utilitzar la sintaxi com printf aquí perquè jo pugui dinàmicament 143 00:06:50,260 --> 00:06:54,000 inserir una mena de longitud pel valor d'una capçalera HTTP 144 00:06:54,000 --> 00:06:55,270 anomenat Content-Length. 145 00:06:55,270 --> 00:06:57,990 I en última instància, he utilitzat la funció dret a escriure en realitat 146 00:06:57,990 --> 00:07:00,040 el cos de la sol·licitud. 147 00:07:00,040 --> 00:07:03,750 >> Per desgràcia, només implementem suport per dinàmicament 148 00:07:03,750 --> 00:07:05,350 arxius PHP generats. 149 00:07:05,350 --> 00:07:08,520 No ens implementem suport a arxius estàtics com gifs i arxius JPEG, 150 00:07:08,520 --> 00:07:10,660 i arxius CSS i HTML. 151 00:07:10,660 --> 00:07:14,450 Això, per desgràcia, es deixa a vostè per respondre a la finalitat client 152 00:07:14,450 --> 00:07:15,090 això a veure. 153 00:07:15,090 --> 00:07:20,050 Així que allà trobareu que hi ha no gaire inspiració dins d'aquest bloc, 154 00:07:20,050 --> 00:07:23,520 però si una mica més amunt del que ens vam anar sobre la interpretació de codi PHP, 155 00:07:23,520 --> 00:07:25,520 les funcions que es van a utilitzar són una mica diferents. 156 00:07:25,520 --> 00:07:27,561 >> De fet, vostè pot demanar prestat part de la funcionalitat 157 00:07:27,561 --> 00:07:29,620 potser de la medicina forense conjunt de problemes, perquè 158 00:07:29,620 --> 00:07:32,860 al final del dia tot el que necessita fer aquí és un cop heu escoltat el que obrir el fitxer 159 00:07:32,860 --> 00:07:35,690 i una vegada que sap que l'anomenat Tipus MIME o tipus de contingut, 160 00:07:35,690 --> 00:07:39,040 vostè necessita llegir en aquests bytes i d'alguna manera ells escopir de tornada. 161 00:07:39,040 --> 00:07:41,190 >> I ara un recorregut per aquest altres funcions d'arxiu. 162 00:07:41,190 --> 00:07:43,820 Fins i tot es connecta primer, que simplement retorna true 163 00:07:43,820 --> 00:07:47,350 quan per fi se sent un la connexió d'un usuari. 164 00:07:47,350 --> 00:07:48,786 El següent és l'error. 165 00:07:48,786 --> 00:07:52,296 Error, per la seva banda, com una funció que escriure per manejar les diferents 400 166 00:07:52,296 --> 00:07:55,360 i l'estat HTTP 500 codis que vostè pot ser que vulgueu 167 00:07:55,360 --> 00:07:58,500 per enviar de nou a l'usuari, juntament amb un missatge estàndard. 168 00:07:58,500 --> 00:08:01,950 >> El següent pas és la càrrega, un particular funció carnós, el propòsit en la vida 169 00:08:01,950 --> 00:08:06,920 està a llegir d'una estrella arxiu punter del contingut d'un arxiu en una memòria intermèdia mundial 170 00:08:06,920 --> 00:08:09,000 que declarem a nivell mundial per sobre de [? principal. ?] 171 00:08:09,000 --> 00:08:12,649 Això és una mica complexa perquè cal llegir els bytes de l'arxiu 172 00:08:12,649 --> 00:08:14,690 però comprovar en cada iteració si ja hem 173 00:08:14,690 --> 00:08:17,600 colpejar el final de l'arxiu o alguna cosa ha anat malament. 174 00:08:17,600 --> 00:08:21,210 I utilitzem realloc per assegurar-se que qualsevol memòria intermèdia que estem fent servir és cada vegada més gran 175 00:08:21,210 --> 00:08:24,440 i creixent i creixent i sempre mantenir-se a l'avantguarda de la quantitat de bytes 176 00:08:24,440 --> 00:08:25,675 que hem d'encaixar-hi. 177 00:08:25,675 --> 00:08:27,550 Handler, per la seva banda, és la funció que rep 178 00:08:27,550 --> 00:08:30,630 cridat per manera de tenir Control C registrada com un senyal de 179 00:08:30,630 --> 00:08:32,140 que volem interceptar. 180 00:08:32,140 --> 00:08:34,070 Noteu aquí a handler que en última instància 181 00:08:34,070 --> 00:08:36,780 trucades detenen, que per descomptat deté el servidor web. 182 00:08:36,780 --> 00:08:39,750 I, per desgràcia, de recerca no s'ha implementat. 183 00:08:39,750 --> 00:08:41,940 En esperit, aquest és un funció bastant simple. 184 00:08:41,940 --> 00:08:44,900 Donada l'extensió d'arxiu, necessita per tornar hi ha l'anomenat MIME 185 00:08:44,900 --> 00:08:46,320 tipus o tipus de contingut. 186 00:08:46,320 --> 00:08:49,260 I s'especifica en el plec de condicions el que la cartografia ha de ser. 187 00:08:49,260 --> 00:08:52,330 Però cal traduir que en última instància al codi c. 188 00:08:52,330 --> 00:08:56,490 >> El següent és la nostra funció similar a carn denominat parse, el propòsit en la vida 189 00:08:56,490 --> 00:08:59,350 és llegir, no des d'un arxiu, però a partir d'una connexió de xarxa. 190 00:08:59,350 --> 00:09:03,510 En concret, la lectura i anàlisi de la Petició HTTP que ha arribat des d'un navegador 191 00:09:03,510 --> 00:09:05,940 al servidor perquè en última instància, podem analitzar 192 00:09:05,940 --> 00:09:09,530 a tan sols les capçaleres de la sol·licitud línia i tornar a aquells que 193 00:09:09,530 --> 00:09:12,720 per mitjà d'un tampó global que declarem anteriorment [? principal. ?] 194 00:09:12,720 --> 00:09:14,880 >> Canviar, per la seva banda, és un funció que definim 195 00:09:14,880 --> 00:09:18,730 que és cridada de forma iterativa l'interior de principal cada vegada que estàs a punt 196 00:09:18,730 --> 00:09:20,799 a punt per començar a escoltar per a una nova connexió 197 00:09:20,799 --> 00:09:22,840 de manera que sempre sabem l'estat de les nostres variables 198 00:09:22,840 --> 00:09:24,870 i pel que hem també alliberat qualsevol memòria que 199 00:09:24,870 --> 00:09:28,070 podria haver estat assignat per una connexió de xarxa anterior. 200 00:09:28,070 --> 00:09:30,060 El següent pas és començar, la funció que escrivim 201 00:09:30,060 --> 00:09:31,920 que conté un conjunt gran quantitat de codi de xarxa 202 00:09:31,920 --> 00:09:34,420 que en última instància s'inicia el servidor web. 203 00:09:34,420 --> 00:09:36,680 >> Dura fins és la funció anomenat parada, que 204 00:09:36,680 --> 00:09:38,770 fa exactament això, deté el servidor web. 205 00:09:38,770 --> 00:09:42,270 Però primer que allibera qualsevol memòria que encara s'ha assignat. 206 00:09:42,270 --> 00:09:45,850 Però diu en última instància de sortida sense ni tan sols retornar el control 207 00:09:45,850 --> 00:09:47,480 a la nostra funció principal. 208 00:09:47,480 --> 00:09:49,480 En última instància, una de les la majoria de les tècniques importants 209 00:09:49,480 --> 00:09:52,680 en l'aplicació d'aquest servidor web és serà una mica d'assaig i error, 210 00:09:52,680 --> 00:09:55,886 tenir un navegador finestra oberta a la dreta i una finestra de terminal a 211 00:09:55,886 --> 00:09:57,760 esquerra, la consola de servidors finestra, de manera que vostè 212 00:09:57,760 --> 00:10:00,420 pot veure els missatges que es troben que es mostra a la pantalla. 213 00:10:00,420 --> 00:10:04,170 >> Però millor encara seria tercera finestra, una segona finestra de terminal, 214 00:10:04,170 --> 00:10:07,135 en què s'utilitza Telnet, l'ús per als que es prescriu en l'especificació. 215 00:10:07,135 --> 00:10:09,640 I Telnet és només una molt programa de xarxa simple 216 00:10:09,640 --> 00:10:12,660 que li permet a fingeixes ser un navegador en una finestra 217 00:10:12,660 --> 00:10:14,540 mentre parla amb l'altra finestra. 218 00:10:14,540 --> 00:10:16,830 D'aquesta manera vostè pot veure exactament les ordres textuals 219 00:10:16,830 --> 00:10:18,700 que estan tornant del servidor al client 220 00:10:18,700 --> 00:10:20,810 sense haver de ficar al voltant de desenvolupador de Chrome 221 00:10:20,810 --> 00:10:24,010 eines en una altra banda interfície clunkier. 222 00:10:24,010 --> 00:10:29,099