1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 COLUMNA: Agora imos de mergullo no código de distribución 3 00:00:11,730 --> 00:00:14,470 e ter un ollar para o contexto en que o código que escribe 4 00:00:14,470 --> 00:00:15,780 estará en funcionamento. 5 00:00:15,780 --> 00:00:17,350 Ao final do día, está indo a aplicar 6 00:00:17,350 --> 00:00:18,710 a totalidade do servidor web. 7 00:00:18,710 --> 00:00:20,460 Pero nós fornecen Lo co esqueleto 8 00:00:20,460 --> 00:00:24,090 código que ten algunhas funcións, particularmente relacionadas coa rede. 9 00:00:24,090 --> 00:00:25,390 Imos dar un ollo. 10 00:00:25,390 --> 00:00:27,560 >> Entón, aquí enriba cara arriba do ficheiro é unha banda 11 00:00:27,560 --> 00:00:30,020 de recurso de proba requisitos macro. 12 00:00:30,020 --> 00:00:33,570 Agora, esta é só unha característica c, segundo o cal segundo unha morea de páxinas man 13 00:00:33,570 --> 00:00:36,410 tes que definir algúns dos esas constantes para ser verdade 14 00:00:36,410 --> 00:00:39,920 ou ser incluso números específicos, para que ten acceso a determinadas funcións. 15 00:00:39,920 --> 00:00:42,470 Se non, eles serán non declarado e non terá acceso. 16 00:00:42,470 --> 00:00:45,340 Entón eu fixen iso por medio ler as páxinas do manual. 17 00:00:45,340 --> 00:00:48,410 Agora alí en baixo, na liñas 15 a 17, nos 18 00:00:48,410 --> 00:00:50,550 ten unha morea de límites declarados. 19 00:00:50,550 --> 00:00:53,370 >> E nós temos prestado estes a partir dun servidor web popular chamado Apache. 20 00:00:53,370 --> 00:00:54,650 E estes son só números que van 21 00:00:54,650 --> 00:00:56,810 para limitar o número total de bytes que se permiten 22 00:00:56,810 --> 00:01:01,930 en varios contextos para a solicitude HTTP que un navegador se admite para me enviar. 23 00:01:01,930 --> 00:01:04,310 Logo definimos octetos. 24 00:01:04,310 --> 00:01:07,790 Agora, un octeto é só un xeito elegante de dicir un byte, ou oito bits. 25 00:01:07,790 --> 00:01:10,720 Acontece que no pasado un byte non era necesariamente oito bits, 26 00:01:10,720 --> 00:01:12,339 así octeto é sempre oito bits. 27 00:01:12,339 --> 00:01:14,880 Polo tanto, neste caso adoptado o que é común na rede 28 00:01:14,880 --> 00:01:17,410 mundo de chamar oito bytes un octeto. 29 00:01:17,410 --> 00:01:21,840 >> Aquí eu especifiquei que vai octetos ser 512, de xeito que moi parecido en medicina forense 30 00:01:21,840 --> 00:01:24,170 cando lemos unha morea de bytes de cada vez, tamén aquí, 31 00:01:24,170 --> 00:01:27,390 imos ler un banda de octetos de cada vez. 32 00:01:27,390 --> 00:01:28,922 Axiña unha morea de arquivos de cabeceira. 33 00:01:28,922 --> 00:01:30,255 Como eu sabía para incluír estes? 34 00:01:30,255 --> 00:01:32,730 Ben, eu simplemente ler o home páxinas a un número de funcións 35 00:01:32,730 --> 00:01:35,620 que imos usar neste distribución código e inclúen aqueles en 36 00:01:35,620 --> 00:01:37,390 Fun instruído a. 37 00:01:37,390 --> 00:01:39,090 >> E agora temos un tipo de datos. 38 00:01:39,090 --> 00:01:41,470 Temos declarou un octeto de ser un char. 39 00:01:41,470 --> 00:01:44,040 E nós veremos máis tarde que iso é utilizado ao longo do código. 40 00:01:44,040 --> 00:01:45,670 E nós temos declarado todo grupo de prototipos, 41 00:01:45,670 --> 00:01:47,961 e imos camiñar rapidamente a través cada unha destas funcións. 42 00:01:47,961 --> 00:01:50,400 Por último, e quizais o máis importante ter en 43 00:01:50,400 --> 00:01:52,520 mente neste momento no a historia, é que non 44 00:01:52,520 --> 00:01:54,520 son, en realidade, un conxunto grupo de variables globais 45 00:01:54,520 --> 00:02:00,430 na parte superior do ficheiro, raíz, CFD, SFD, solicitude, arquivo e corpo. 46 00:02:00,430 --> 00:02:03,960 >> Agora, xeralmente, utilizando tantos mundial variables ou variables globais en todo, 47 00:02:03,960 --> 00:02:05,280 Non é a práctica de volta. 48 00:02:05,280 --> 00:02:09,090 Pero acontece tamén estamos usando un técnica chamada de manipulación de sinal máis tarde 49 00:02:09,090 --> 00:02:11,930 no código, o que nos permite detectar cando o usuario chega algo 50 00:02:11,930 --> 00:02:15,080 como CTRL C e desactivar o servidor graciosamente. 51 00:02:15,080 --> 00:02:18,240 E, para facelo correctamente e, en realidade, liberar memoria, 52 00:02:18,240 --> 00:02:20,800 necesitamos ter acceso a estas variables globais. 53 00:02:20,800 --> 00:02:24,510 >> E agora imos dar un ollo ao principal, que impulsa a totalidade deste programa. 54 00:02:24,510 --> 00:02:27,720 En primeiro lugar, no alto aquí ter un número variable de erro 55 00:02:27,720 --> 00:02:29,570 que parece non ter un tipo, pero iso é 56 00:02:29,570 --> 00:02:31,500 porque é realmente definida nun ficheiro chamado 57 00:02:31,500 --> 00:02:34,800 erro errno.h que está incluído máis arriba. 58 00:02:34,800 --> 00:02:38,780 Se fai o home errno para realmente ver a definición de tal cousa, 59 00:02:38,780 --> 00:02:41,230 vai ver que este é un variable global especial que 60 00:02:41,230 --> 00:02:43,350 defínese por un grupo enteiro de funcións non escrita 61 00:02:43,350 --> 00:02:48,730 por nós, pero polos autores do Linux e outros sistemas para realmente definir 62 00:02:48,730 --> 00:02:52,400 un número para esa variable cando algo sae mal, para que poida globalmente 63 00:02:52,400 --> 00:02:54,830 descubrir o que deu errado. 64 00:02:54,830 --> 00:02:58,540 >> Agora, debaixo verá unha nova técnica quizais usando getopt, 65 00:02:58,540 --> 00:03:01,790 unha función que axuda mando parse Argumentos da liña de xeito que non facer 66 00:03:01,790 --> 00:03:05,540 ten que preocuparse en perder tempo imaxinando como analizar algo como 8080, 67 00:03:05,540 --> 00:03:08,350 ou trazo p, ou trazo h para obter axuda. 68 00:03:08,350 --> 00:03:10,300 getopt esencialmente fai iso por nós. 69 00:03:10,300 --> 00:03:11,750 Consulte a páxina de manual para máis. 70 00:03:11,750 --> 00:03:13,960 >> A continuación, facer un pouco de erro verificación para asegurarse de 71 00:03:13,960 --> 00:03:17,420 que o número de porto está dentro o intervalo especificado no spec. 72 00:03:17,420 --> 00:03:20,240 Logo vemos unha chamada á función comezar, cuxa definición imos 73 00:03:20,240 --> 00:03:24,040 mirar nun momento, e como o seu nome suxire, este inicia o servidor web. 74 00:03:24,040 --> 00:03:26,960 Aquí temos unha chamada a unha función chamado de sinal que di: 75 00:03:26,960 --> 00:03:30,750 se e cando escoitar Control C do teclado do usuario, dalle chamar 76 00:03:30,750 --> 00:03:34,650 un manipulador función chamada que está pasando cousas para, finalmente, limpar e deixar 77 00:03:34,650 --> 00:03:35,500 o servidor. 78 00:03:35,500 --> 00:03:39,470 >> Abaixo que é o que parece ser un ciclo infinito, a primeira liña das cales 79 00:03:39,470 --> 00:03:41,660 efectivamente é unha chamada a unha función chamada 80 00:03:41,660 --> 00:03:45,110 axustar, que nós mesmos aplicar, máis tarde, a fin 81 00:03:45,110 --> 00:03:47,470 para liberar algúns dos nosos estados globais. 82 00:03:47,470 --> 00:03:50,480 Despois que é unha liña de código que condicional 83 00:03:50,480 --> 00:03:52,576 está comprobando o retorno valor do contacto. 84 00:03:52,576 --> 00:03:55,700 Agora looks conectados como un predicado, algo que retorna verdadeiro ou falso. 85 00:03:55,700 --> 00:03:58,040 E fai, pero non hai algo especial en conectado 86 00:03:58,040 --> 00:03:59,960 na medida en que é unha chamada de bloqueo. 87 00:03:59,960 --> 00:04:03,180 Vai sentir alí e esperar ata que o navegador do usuario 88 00:04:03,180 --> 00:04:05,860 tenta conectarse a este web servidor e só entón el 89 00:04:05,860 --> 00:04:10,160 volver verdadeiro ou falso, para que poidamos continuar cara ao interior deste if. 90 00:04:10,160 --> 00:04:13,870 >> Unha vez alí, observe esta función a un función chamada de análise, o que escribimos, 91 00:04:13,870 --> 00:04:17,230 que analiza todo octetos, todo dos bytes procedentes dun navegador 92 00:04:17,230 --> 00:04:21,010 ao servidor, para que poidamos entregar Lo de volta, en definitiva o valor para outro 93 00:04:21,010 --> 00:04:24,420 desas variables globais que tendas de todo bytes en só 94 00:04:24,420 --> 00:04:26,630 cabeceiras de que solicitude, non o corpo 95 00:04:26,630 --> 00:04:28,920 se non houbese un corpo realmente a el. 96 00:04:28,920 --> 00:04:32,980 >> Agora baixo comezamos a analizar estes cabezallos para extraer 97 00:04:32,980 --> 00:04:35,490 un subconxunto da información que nos preocupa. 98 00:04:35,490 --> 00:04:37,740 En concreto, o per especificación, primeiro 99 00:04:37,740 --> 00:04:40,580 quería pedir liña, que é só que moito primeira liña que 100 00:04:40,580 --> 00:04:45,710 espero que di algo así como get cortar ou algún camiño e, a continuación, HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Estamos a usar esa metáfora dunha agulla nun palheiro 102 00:04:48,150 --> 00:04:50,370 buscar especial caracteres ou enderezos. 103 00:04:50,370 --> 00:04:53,120 E, de feito, hai un número de funcións no noso código de distribución 104 00:04:53,120 --> 00:04:56,930 que, ademais, poden ser útiles cando se mira para valores particulares. 105 00:04:56,930 --> 00:05:00,630 >> En definitiva, nós copiar estes bytes nunha liña variable chamada, 106 00:05:00,630 --> 00:05:03,510 que notar, tamén, temos alocados na pila 107 00:05:03,510 --> 00:05:05,890 por medio dunha matriz Deseñada de forma dinámica. 108 00:05:05,890 --> 00:05:08,350 E nós estamos tentando deliberadamente para evitar chamar malloc 109 00:05:08,350 --> 00:05:11,100 porque de novo, porque Control de C sendo 110 00:05:11,100 --> 00:05:14,630 unha característica potencial deste programa, non quero ter ese código de súpeto 111 00:05:14,630 --> 00:05:17,479 interrompida polo bater do usuario Control C, o resultado dos cales 112 00:05:17,479 --> 00:05:20,270 é que eu non podería ter unha oportunidade de balde algo que malloced. 113 00:05:20,270 --> 00:05:23,660 Entón eu estou tentando utilizar a mesma cantidade da pila é que podo aquí. 114 00:05:23,660 --> 00:05:26,040 >> A continuación, un grupo enteiro de para dos. 115 00:05:26,040 --> 00:05:28,930 A especificación pode expoñer o que se espera aquí, 116 00:05:28,930 --> 00:05:31,800 pero os comentarios danlle unha información do que está por vir. 117 00:05:31,800 --> 00:05:33,830 Vostede primeiro que validar a liña de solicitude 118 00:05:33,830 --> 00:05:37,760 e asegúrese de que el se parece o especificacións gramática, por así dicir, 119 00:05:37,760 --> 00:05:38,541 di que debería. 120 00:05:38,541 --> 00:05:41,290 Logo cómpre extraer algo chamado a consulta, o material para fóra 121 00:05:41,290 --> 00:05:44,200 tras un signo de interrogación, como vimos co noso exemplo Google 122 00:05:44,200 --> 00:05:46,320 de paso nun parámetro de HD. 123 00:05:46,320 --> 00:05:49,050 Nós entón concatenar xuntos a raíz do servidor web 124 00:05:49,050 --> 00:05:52,520 co camiño que está que a primeira liña de solicitude 125 00:05:52,520 --> 00:05:56,010 e formar a ruta completa o ficheiro que quere buscar. 126 00:05:56,010 --> 00:06:00,300 >> Despois diso, imos estar seguro se o ficheiro existe e é lexible. 127 00:06:00,300 --> 00:06:05,100 E entón nós estamos indo a extraer o seu extensión de arquivo, o .html ou o .PHP, 128 00:06:05,100 --> 00:06:09,920 ou algunha extensión que está no final da cadea solicitado. 129 00:06:09,920 --> 00:06:11,940 Logo é un todo chea de código que escribimos 130 00:06:11,940 --> 00:06:15,800 para xerar efecto PHP contido xerado por ti. 131 00:06:15,800 --> 00:06:18,010 En poucas palabras, este código leva o nome 132 00:06:18,010 --> 00:06:20,250 do ficheiro que desexa PHP para interpretar. 133 00:06:20,250 --> 00:06:24,630 Nós pasalo por algo chamado un tubo en intérprete de PHP. 134 00:06:24,630 --> 00:06:28,060 Volva resposta como se a resposta fose ela mesma un arquivo. 135 00:06:28,060 --> 00:06:32,110 E, entón, interactuar sobre o ficheiro de bytes, tirando-los todos nun buffer 136 00:06:32,110 --> 00:06:34,180 para que poidamos, en última instancia imprimir-las. 137 00:06:34,180 --> 00:06:37,230 >> Efectivamente, todos estes chama aquí a dprintf 138 00:06:37,230 --> 00:06:40,110 nos permite imprimir algo chamado un descritor de ficheiro, o que 139 00:06:40,110 --> 00:06:42,350 é só un número enteiro que representa un ficheiro. 140 00:06:42,350 --> 00:06:45,360 Moi semellante en espírito, pero fundamentalmente diferente dun ficheiro 141 00:06:45,360 --> 00:06:46,620 punteiro estrela. 142 00:06:46,620 --> 00:06:50,260 Observe como pode usar a sintaxe como printf aquí para que eu poida dinamicamente 143 00:06:50,260 --> 00:06:54,000 inserir algo como a lonxitude ao valor dun cabeceira HTTP 144 00:06:54,000 --> 00:06:55,270 chamado Content-Length. 145 00:06:55,270 --> 00:06:57,990 E, finalmente, eu usei o dereito de realmente escribir función 146 00:06:57,990 --> 00:07:00,040 o corpo da solicitude. 147 00:07:00,040 --> 00:07:03,750 >> Desafortunadamente, só aplicado soporte para dinamicamente 148 00:07:03,750 --> 00:07:05,350 arquivos PHP xerada. 149 00:07:05,350 --> 00:07:08,520 Non aplicar o soporte para arquivos estáticos, como gifs, e JPEG 150 00:07:08,520 --> 00:07:10,660 e arquivos CSS e HTML. 151 00:07:10,660 --> 00:07:14,450 Isto, por desgraza, é deixarse ​​para ti para responder ao obxectivo cliente 152 00:07:14,450 --> 00:07:15,090 esta a facer. 153 00:07:15,090 --> 00:07:20,050 Entón, alí vai descubrir que non hai non moita inspiración dentro dese bloque, 154 00:07:20,050 --> 00:07:23,520 pero se un pouco máis arriba coa forma como nós fomos sobre a interpretación do código PHP, 155 00:07:23,520 --> 00:07:25,520 as funcións que vai empregar son un pouco diferentes. 156 00:07:25,520 --> 00:07:27,561 >> De feito, pode pedir algunhas das características 157 00:07:27,561 --> 00:07:29,620 quizais a partir dos forense conxunto de problemas, porque 158 00:07:29,620 --> 00:07:32,860 ao final do día todo o que necesitas facer aquí é cando vostede sabe que abrir o ficheiro 159 00:07:32,860 --> 00:07:35,690 e unha vez que sabe que se chama Tipo MIME ou tipo de contido, 160 00:07:35,690 --> 00:07:39,040 ten que ler neses bytes e dalgunha forma cuspi-los de volta para fóra. 161 00:07:39,040 --> 00:07:41,190 >> E agora un tour por esta outras funcións do arquivo. 162 00:07:41,190 --> 00:07:43,820 Ata primeiro está conectado, que simplemente retorna true 163 00:07:43,820 --> 00:07:47,350 cando finalmente escoita un conexión desde un usuario. 164 00:07:47,350 --> 00:07:48,786 Logo é erro. 165 00:07:48,786 --> 00:07:52,296 Erro, á súa vez, como unha función que escribiu para tratar con todas as diferentes 400 166 00:07:52,296 --> 00:07:55,360 eo estado de HTTP 500 códigos que pode querer 167 00:07:55,360 --> 00:07:58,500 para enviar de volta para o usuario, xunto cunha mensaxe estándar. 168 00:07:58,500 --> 00:08:01,950 >> A continuación é a carga, especialmente función de carne, cuxo propósito na vida 169 00:08:01,950 --> 00:08:06,920 é para ler dunha estrela do punteiro do ficheiro do contido dun ficheiro nun buffer mundial 170 00:08:06,920 --> 00:08:09,000 que declarou a nivel mundial arriba [? principal. ?] 171 00:08:09,000 --> 00:08:12,649 Este é un pouco complexo, porque nós ten que ler os bytes do ficheiro 172 00:08:12,649 --> 00:08:14,690 pero comprobar en cada iteración se nós xa 173 00:08:14,690 --> 00:08:17,600 alcanzou o fin do ficheiro ou outra cousa deu mal. 174 00:08:17,600 --> 00:08:21,210 E usamos realloc para asegurarse de que calquera que sexa tapón Utilizamos está crecendo 175 00:08:21,210 --> 00:08:24,440 e crecendo e crecendo e sempre quedando á fronte do número de bytes 176 00:08:24,440 --> 00:08:25,675 que necesitamos para caber dentro. 177 00:08:25,675 --> 00:08:27,550 Handler, con todo, é a función que recibe 178 00:08:27,550 --> 00:08:30,630 chamado por medio de ter Control C rexistrado como un sinal 179 00:08:30,630 --> 00:08:32,140 que queremos interceptar. 180 00:08:32,140 --> 00:08:34,070 Observe aquí no manipulador que, en definitiva 181 00:08:34,070 --> 00:08:36,780 chamadas de parar, o que naturalmente para o servidor web. 182 00:08:36,780 --> 00:08:39,750 E, por desgraza, lookup non está implementado. 183 00:08:39,750 --> 00:08:41,940 En espírito, este é un función moi sinxelo. 184 00:08:41,940 --> 00:08:44,900 Dada a extensión do ficheiro, el que devolve-lo está o chamado MIME 185 00:08:44,900 --> 00:08:46,320 tipo ou tipo de contido. 186 00:08:46,320 --> 00:08:49,260 E nós especificar na especificación o que este cartografía debe ser. 187 00:08:49,260 --> 00:08:52,330 Pero ten que traducir en definitiva, ao código c. 188 00:08:52,330 --> 00:08:56,490 >> A continuación é a nosa función semellante de carne chamado de análise, cuxo propósito na vida 189 00:08:56,490 --> 00:08:59,350 é ler, non a partir dun ficheiro, pero desde unha conexión de rede. 190 00:08:59,350 --> 00:09:03,510 En concreto, a lectura e análise Solicitude HTTP que está vindo dun navegador 191 00:09:03,510 --> 00:09:05,940 ao servidor de xeito que en definitiva, podemos analizar 192 00:09:05,940 --> 00:09:09,530 con só as cabeceiras na solicitude liña e volver aqueles para ti 193 00:09:09,530 --> 00:09:12,720 por medio dunha memoria temporal global que declaramos riba [? principal. ?] 194 00:09:12,720 --> 00:09:14,880 >> Reset, con todo, é un función que definimos 195 00:09:14,880 --> 00:09:18,730 que se chama de forma iterativa dentro do principal cada vez que está a piques 196 00:09:18,730 --> 00:09:20,799 listo para comezar a escoitar para unha nova conexión 197 00:09:20,799 --> 00:09:22,840 de xeito que sempre sabemos o estado das nosas variables 198 00:09:22,840 --> 00:09:24,870 e para que nós tamén liberou calquera memoria que 199 00:09:24,870 --> 00:09:28,070 pode ser asignado para unha conexión de rede anterior. 200 00:09:28,070 --> 00:09:30,060 Axiña iníciase, o función que escribimos 201 00:09:30,060 --> 00:09:31,920 que contén un conxunto chea de código de rede 202 00:09:31,920 --> 00:09:34,420 que finalmente inicia o servidor web. 203 00:09:34,420 --> 00:09:36,680 >> Última up é a función chamado stop, que 204 00:09:36,680 --> 00:09:38,770 fai exactamente iso, para o servidor web. 205 00:09:38,770 --> 00:09:42,270 Pero, primeiro, el libera calquera memoria que aínda se asignado. 206 00:09:42,270 --> 00:09:45,850 Pero, en definitiva chama exit sen tan sequera voltar o control 207 00:09:45,850 --> 00:09:47,480 a nosa función principal. 208 00:09:47,480 --> 00:09:49,480 En definitiva, un dos a maioría das técnicas importantes 209 00:09:49,480 --> 00:09:52,680 ao aplicar este servidor web é vai ser un pouco de intento e erro, 210 00:09:52,680 --> 00:09:55,886 ter un navegador xanela aberta á dereita e unha fiestra de terminal en 211 00:09:55,886 --> 00:09:57,760 á esquerda, a consola de servidores fiestra, de xeito que 212 00:09:57,760 --> 00:10:00,420 pode ver as mensaxes que son sendo presentada na pantalla. 213 00:10:00,420 --> 00:10:04,170 >> Pero mellor aínda sería un terceiro fiestra, unha fiestra segundo terminal, 214 00:10:04,170 --> 00:10:07,135 en que usa o Telnet, o uso para o cal está prescrito no spec. 215 00:10:07,135 --> 00:10:09,640 E Telnet é só un moi programa de rede sinxelo 216 00:10:09,640 --> 00:10:12,660 que permite que finxir ser un navegador dunha fiestra 217 00:10:12,660 --> 00:10:14,540 mentres conversaba coa outra xanela. 218 00:10:14,540 --> 00:10:16,830 Desta forma, podes ver exactamente as ordes textuais 219 00:10:16,830 --> 00:10:18,700 que están volvendo do servidor ao cliente 220 00:10:18,700 --> 00:10:20,810 sen ter de desentullo en torno a creador de Chrome 221 00:10:20,810 --> 00:10:24,010 ferramentas en outra forma Interface clunkier. 222 00:10:24,010 --> 00:10:29,099