1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 SPEAKER: Acum să se arunca cu capul în codul de distribuție 3 00:00:11,730 --> 00:00:14,470 și să ia o privire la contextul în care codul pe care îl scrie 4 00:00:14,470 --> 00:00:15,780 va fi de operare. 5 00:00:15,780 --> 00:00:17,350 La sfârșitul zilei, ai de gând să pună în aplicare 6 00:00:17,350 --> 00:00:18,710 totalitatea serverul de web. 7 00:00:18,710 --> 00:00:20,460 Dar ne-am asigurat tu cu scheletul 8 00:00:20,460 --> 00:00:24,090 cod care au putea funcționa, în special legate de rețea. 9 00:00:24,090 --> 00:00:25,390 Să aruncăm o privire. 10 00:00:25,390 --> 00:00:27,560 >> Deci, aici spre partea de sus a dosarului este un buchet 11 00:00:27,560 --> 00:00:30,020 de facilitate de testare cerințelor macro. 12 00:00:30,020 --> 00:00:33,570 Acum, aceasta este doar o trăsătură de c, prin care în conformitate cu o grămadă de pagini man 13 00:00:33,570 --> 00:00:36,410 trebuie să definiți unele din aceste constante să fie adevărat 14 00:00:36,410 --> 00:00:39,920 sau să fie chiar anumite numere, astfel încât aveți acces la anumite funcții. 15 00:00:39,920 --> 00:00:42,470 În caz contrar, acestea vor fi nedeclarate și nu veți avea acces. 16 00:00:42,470 --> 00:00:45,340 Așa că am făcut acest lucru prin fel de a citi paginile de manual. 17 00:00:45,340 --> 00:00:48,410 Acum jos, în Liniile 15 și 17, noi 18 00:00:48,410 --> 00:00:50,550 au o grămadă de limite declarate. 19 00:00:50,550 --> 00:00:53,370 >> Și am împrumutat acestea la un server web popular numit Apache. 20 00:00:53,370 --> 00:00:54,650 Și acestea sunt doar Numerele care vor 21 00:00:54,650 --> 00:00:56,810 să limiteze numărul total de bytes care sunt permise 22 00:00:56,810 --> 00:01:01,930 în diverse contexte pentru cererea HTTP că un browser este permis să-mi trimită. 23 00:01:01,930 --> 00:01:04,310 Mai departe, vom defini octeti. 24 00:01:04,310 --> 00:01:07,790 Acum, un octet este doar un mod de lux de a spune un octet, sau opt biți. 25 00:01:07,790 --> 00:01:10,720 Se pare că într-odinioară un octet Nu a fost necesar opt biți, 26 00:01:10,720 --> 00:01:12,339 așa octet este întotdeauna opt biți. 27 00:01:12,339 --> 00:01:14,880 Deci, în acest caz, am adoptat ceea ce este comun în rețea 28 00:01:14,880 --> 00:01:17,410 lume de asteptare opt octeti un octet. 29 00:01:17,410 --> 00:01:21,840 >> Aici am precizat că octeti va fie 512, astfel încât de mult ca în criminalistica 30 00:01:21,840 --> 00:01:24,170 când am citit o grămadă de bytes la un moment dat, aici, 31 00:01:24,170 --> 00:01:27,390 vom citi o buchet de octeti la un moment dat. 32 00:01:27,390 --> 00:01:28,922 Mai departe o grămadă de fișiere antet. 33 00:01:28,922 --> 00:01:30,255 Cum știu să includă astea? 34 00:01:30,255 --> 00:01:32,730 Ei bine, am citit pur și simplu omul pagini pentru un număr de funcții 35 00:01:32,730 --> 00:01:35,620 că vom folosi în această distribuție cod și să includă în cele 36 00:01:35,620 --> 00:01:37,390 Am fost instruit să. 37 00:01:37,390 --> 00:01:39,090 >> Și acum avem un tip de date. 38 00:01:39,090 --> 00:01:41,470 Am declarat un octet a fi un char. 39 00:01:41,470 --> 00:01:44,040 Și vom vedea mai târziu că este utilizate în întreaga codul. 40 00:01:44,040 --> 00:01:45,670 Și am declarat un grămadă de prototipuri, 41 00:01:45,670 --> 00:01:47,961 și vom plimba rapid prin fiecare dintre aceste funcții. 42 00:01:47,961 --> 00:01:50,400 În cele din urmă, și, probabil, cel mai important să se țină 43 00:01:50,400 --> 00:01:52,520 minte în acest moment în povestea, este că nu există 44 00:01:52,520 --> 00:01:54,520 sunt, de fapt, un întreg grămadă de variabile globale 45 00:01:54,520 --> 00:02:00,430 în partea de sus a fișierului, rădăcină, CFD, SFD, cerere, fișier și corp. 46 00:02:00,430 --> 00:02:03,960 >> Acum, în general, folosind atât de multe la nivel mondial variabile, sau variabile globale la toate, 47 00:02:03,960 --> 00:02:05,280 nu este practica spate. 48 00:02:05,280 --> 00:02:09,090 Dar se pare că suntem, de asemenea, cu ajutorul unui Manipularea semnal tehnica numita mai târziu 49 00:02:09,090 --> 00:02:11,930 în codul, ceea ce ne permite să detecta atunci când utilizatorul hit-uri ceva 50 00:02:11,930 --> 00:02:15,080 ca CTRL C și închide serverul grațios. 51 00:02:15,080 --> 00:02:18,240 Și pentru a face asta cu grație și de fapt a elibera memorie, 52 00:02:18,240 --> 00:02:20,800 trebuie să avem acces la aceste variabile globale. 53 00:02:20,800 --> 00:02:24,510 >> Și acum să aruncăm o privire la principal, care conduce ansamblul acestui program. 54 00:02:24,510 --> 00:02:27,720 În primul rând, în partea de sus de aici noi au un număr variabil de eroare 55 00:02:27,720 --> 00:02:29,570 care pare a nu au un tip, dar asta e 56 00:02:29,570 --> 00:02:31,500 pentru că este de fapt definite într-un fișier numit 57 00:02:31,500 --> 00:02:34,800 Eroare errno.h care este inclus în sus mai mare. 58 00:02:34,800 --> 00:02:38,780 Dacă veți face om errno la efectiv a se vedea definiția de acest lucru, 59 00:02:38,780 --> 00:02:41,230 veți vedea că aceasta este o Global variabilă special, care 60 00:02:41,230 --> 00:02:43,350 este stabilit de o grămadă funcțiilor nu scrise 61 00:02:43,350 --> 00:02:48,730 de noi, ci de autorii Linux și alte sisteme pentru a stabili efectiv 62 00:02:48,730 --> 00:02:52,400 un număr de care variabil, atunci când ceva nu merge bine, astfel încât să puteți la nivel global 63 00:02:52,400 --> 00:02:54,830 dau seama ce a făcut merge prost. 64 00:02:54,830 --> 00:02:58,540 >> Acum mai jos veți vedea o nouă Tehnica probabil folosind getopt, 65 00:02:58,540 --> 00:03:01,790 o funcție care ajută comanda analizare argumente în linia de astfel încât să nu 66 00:03:01,790 --> 00:03:05,540 Trebuie să deranjeze timp pierdem imaginind cum pentru a analiza ceva de genul 8080, 67 00:03:05,540 --> 00:03:08,350 sau cratimă p, sau liniuță h pentru a obține ajutor. 68 00:03:08,350 --> 00:03:10,300 getopt face, în esență, că pentru noi. 69 00:03:10,300 --> 00:03:11,750 Consultați pagina de manual pentru mai multe. 70 00:03:11,750 --> 00:03:13,960 >> Mai departe, vom face un pic de eroare de verificare pentru a vă asigura 71 00:03:13,960 --> 00:03:17,420 că numărul de port este în intervalul specificat în spec. 72 00:03:17,420 --> 00:03:20,240 Mai departe, vom vedea o chemare la funcția începe, a cărui definiție vom 73 00:03:20,240 --> 00:03:24,040 uita-te la într-un moment, și ca numele său sugerează, aceasta începe serverul de web. 74 00:03:24,040 --> 00:03:26,960 Aici avem un apel la o funcție numit semnal care spune, 75 00:03:26,960 --> 00:03:30,750 dacă și atunci când auzi de control C de la tastatură utilizatorului, mergeți mai departe și de apel 76 00:03:30,750 --> 00:03:34,650 un handler funcție numită ce se intampla lucruri pentru a curăța în cele din urmă în sus și opri 77 00:03:34,650 --> 00:03:35,500 serverul. 78 00:03:35,500 --> 00:03:39,470 >> Mai jos, care este ceea ce pare a fi o buclă infinită, din care prima linie 79 00:03:39,470 --> 00:03:41,660 eficient este un apel la o funcție numită 80 00:03:41,660 --> 00:03:45,110 reseta, care ne-am punerea în aplicare a mai târziu, în ordine 81 00:03:45,110 --> 00:03:47,470 pentru a elibera o parte din statele noastre globale. 82 00:03:47,470 --> 00:03:50,480 După aceea este o linie de cod care condiționat 83 00:03:50,480 --> 00:03:52,576 verifică revenirea Valoarea de conectat. 84 00:03:52,576 --> 00:03:55,700 Arata acum conectate, cum ar fi un predicat, ceva care returnează adevărat sau fals. 85 00:03:55,700 --> 00:03:58,040 Și o face, dar nu e ceva special în conectat 86 00:03:58,040 --> 00:03:59,960 prin aceea că este un apel de blocare. 87 00:03:59,960 --> 00:04:03,180 Acesta va sta acolo și să aștepte până la browser-ul unui utilizator 88 00:04:03,180 --> 00:04:05,860 încearcă să se conecteze la acest web serverul și numai atunci va 89 00:04:05,860 --> 00:04:10,160 întoarce adevărat sau fals, astfel încât să continuăm în interiorul acestui if. 90 00:04:10,160 --> 00:04:13,870 >> Odată ajunși acolo, observa această funcție într-o funcție numită parse, pe care am scris, 91 00:04:13,870 --> 00:04:17,230 care analizează toate octeti, toate de bytes care provin dintr-un browser 92 00:04:17,230 --> 00:04:21,010 la server, astfel încât să putem preda te-ai întors în cele din urmă o valoare de un 93 00:04:21,010 --> 00:04:24,420 de aceste variabile globale care stochează toate de octeți în doar 94 00:04:24,420 --> 00:04:26,630 anteturile de care cerere, nu corpul 95 00:04:26,630 --> 00:04:28,920 dacă ar exista de fapt un corp de ea. 96 00:04:28,920 --> 00:04:32,980 >> Acum mai jos vom începe să analiza aceste antete pentru a extrage 97 00:04:32,980 --> 00:04:35,490 un subset al informațiilor că ne pasă. 98 00:04:35,490 --> 00:04:37,740 Mai exact, pe caietul de sarcini, noi mai întâi 99 00:04:37,740 --> 00:04:40,580 a vrut să solicite linie, care este doar că prima linie care 100 00:04:40,580 --> 00:04:45,710 sperăm spune ceva de genul get slash sau unele cale și apoi HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Suntem folosind acest metaforă de un ac in carul cu fan 102 00:04:48,150 --> 00:04:50,370 să caute special caractere sau adrese. 103 00:04:50,370 --> 00:04:53,120 Și într-adevăr, există un număr de funcții în codul nostru de distributie 104 00:04:53,120 --> 00:04:56,930 pe care le, de asemenea, s-ar putea găsi de ajutor atunci când caută pentru valorile particulare. 105 00:04:56,930 --> 00:05:00,630 >> În cele din urmă, am copia aceste bytes într-o linie variabilă numită, 106 00:05:00,630 --> 00:05:03,510 care observa, de asemenea, ne-am alocate pe stivă 107 00:05:03,510 --> 00:05:05,890 prin intermediul unei matrice de dimensiuni dinamic. 108 00:05:05,890 --> 00:05:08,350 Și suntem în mod deliberat încearcă pentru a evita apelarea malloc 109 00:05:08,350 --> 00:05:11,100 deoarece din nou, deoarece de control C fiind 110 00:05:11,100 --> 00:05:14,630 o caracteristică potențial a acestui program, ne-am nu doresc să aibă acest cod brusc 111 00:05:14,630 --> 00:05:17,479 întreruptă de lovirea utilizator Controlul C, al cărei rezultat 112 00:05:17,479 --> 00:05:20,270 este că s-ar putea să nu aibă o șansă pentru ceva gratuit am malloced. 113 00:05:20,270 --> 00:05:23,660 Așa că am încercat să folosească cât mai mult stivei este pot aici. 114 00:05:23,660 --> 00:05:26,040 >> Următorul, o grămadă de la dos. 115 00:05:26,040 --> 00:05:28,930 Caietul de sarcini va expune pe exact ceea ce se așteaptă aici, 116 00:05:28,930 --> 00:05:31,800 dar comentariile pe care le dau un indiciu a ceea ce se află în fața. 117 00:05:31,800 --> 00:05:33,830 Mai întâi trebuie să valida linia cerere 118 00:05:33,830 --> 00:05:37,760 și asigurați-vă că se pare că caietul de sarcini gramatica, ca să spunem așa, 119 00:05:37,760 --> 00:05:38,541 spune că ar trebui. 120 00:05:38,541 --> 00:05:41,290 Apoi nevoie pentru a extrage ceva numit interogare, chestii afară 121 00:05:41,290 --> 00:05:44,200 după un semn de întrebare, cum ar fi am văzut cu exemplul nostru Google 122 00:05:44,200 --> 00:05:46,320 în treacăt într-un parametru HD. 123 00:05:46,320 --> 00:05:49,050 Apoi înlănțui împreună rădăcina serverului web 124 00:05:49,050 --> 00:05:52,520 cu calea pe care se află într- această cerere primul rând 125 00:05:52,520 --> 00:05:56,010 și formează calea completă a fișierul vrem să căutăm. 126 00:05:56,010 --> 00:06:00,300 >> După aceea, vom să ne asigurăm că fișierul există și este lizibil. 127 00:06:00,300 --> 00:06:05,100 Și apoi vom extrage sale extensie de fișier, .html sau .php, 128 00:06:05,100 --> 00:06:09,920 sau o astfel de prelungire care, la foarte capăt șirului solicitate. 129 00:06:09,920 --> 00:06:11,940 Următorul este un întreg grămadă de cod am scris 130 00:06:11,940 --> 00:06:15,800 pentru a genera fapt PHP generat de conținut pentru tine. 131 00:06:15,800 --> 00:06:18,010 Într-un cuvânt, aceasta cod are în numele 132 00:06:18,010 --> 00:06:20,250 din fișierul pe care doriți PHP să interpreteze. 133 00:06:20,250 --> 00:06:24,630 Am trece prin ceva numit o țeavă în interpret PHP. 134 00:06:24,630 --> 00:06:28,060 Du-te înapoi răspunsul ca și cum răspunsul a fost un fișier în sine. 135 00:06:28,060 --> 00:06:32,110 Și apoi ne repeta peste care fișier bytes, trăgând-le pe toate într-un singur tampon 136 00:06:32,110 --> 00:06:34,180 astfel încât să putem în cele din urmă printeaza-le. 137 00:06:34,180 --> 00:06:37,230 >> Într-adevăr, toate acestea solicită aici pentru a dprintf 138 00:06:37,230 --> 00:06:40,110 ne permite să imprimați ceva numit un descriptor de fisier, care 139 00:06:40,110 --> 00:06:42,350 este doar un număr întreg care reprezintă un fișier. 140 00:06:42,350 --> 00:06:45,360 Foarte asemănător în spirit, dar fundamental diferit de la un fișier 141 00:06:45,360 --> 00:06:46,620 pointer stele. 142 00:06:46,620 --> 00:06:50,260 Observați modul în care puteți utiliza sintaxă ca printf aici așa că pot dinamic 143 00:06:50,260 --> 00:06:54,000 introduce ceva de genul lungimea pentru valoarea afara HTTP 144 00:06:54,000 --> 00:06:55,270 numit Content-Length. 145 00:06:55,270 --> 00:06:57,990 Și în cele din urmă am folosit Funcția dreptul de a scrie de fapt 146 00:06:57,990 --> 00:07:00,040 corpul cererii. 147 00:07:00,040 --> 00:07:03,750 >> Din păcate, ne-am pus în aplicare doar sprijin pentru dinamic 148 00:07:03,750 --> 00:07:05,350 fișierele PHP generate. 149 00:07:05,350 --> 00:07:08,520 Nu am în aplicare de sprijin pentru Fișierele statice, cum ar fi gif-uri, și JPEG, 150 00:07:08,520 --> 00:07:10,660 și CSS și HTML fișiere. 151 00:07:10,660 --> 00:07:14,450 Asta, din păcate, este lăsată la tine a răspunde scopului client 152 00:07:14,450 --> 00:07:15,090 asta face. 153 00:07:15,090 --> 00:07:20,050 Deci, acolo veți găsi că există nu de mult inspirație în acest bloc, 154 00:07:20,050 --> 00:07:23,520 dar dacă un pic mai mare de până la modul în care ne-am dus despre interpretarea cod PHP, 155 00:07:23,520 --> 00:07:25,520 funcțiile veți utiliza sunt un pic diferit. 156 00:07:25,520 --> 00:07:27,561 >> De fapt, puteți împrumuta parte din funcționalitatea 157 00:07:27,561 --> 00:07:29,620 probabil de la criminalistica set problemă, pentru că 158 00:07:29,620 --> 00:07:32,860 la sfârșitul zilei tot ce ai nevoie pentru a face aici este din ce stiti ce fișier deschis 159 00:07:32,860 --> 00:07:35,690 și odată ce știi că e așa-numitele Tip MIME sau tip de conținut, 160 00:07:35,690 --> 00:07:39,040 aveți nevoie pentru a citi în aceste octeți și într-un fel le scuipe înapoi. 161 00:07:39,040 --> 00:07:41,190 >> Și acum un tur al acestui alte funcții fișierului. 162 00:07:41,190 --> 00:07:43,820 Până în primul rând este conectat, care pur și simplu returneaza true 163 00:07:43,820 --> 00:07:47,350 când se aude în cele din urmă o conexiune de la un utilizator. 164 00:07:47,350 --> 00:07:48,786 Următorul este eroare. 165 00:07:48,786 --> 00:07:52,296 Eroare, între timp, așa cum o vom funcție a scris să se ocupe de toate de diferite 400 166 00:07:52,296 --> 00:07:55,360 și statutul 500 HTTP coduri care v-ar dori 167 00:07:55,360 --> 00:07:58,500 pentru a trimite înapoi la utilizator, împreună cu un mesaj standard. 168 00:07:58,500 --> 00:08:01,950 >> Următorul este de sarcină, un deosebit de Funcția miez, al cărui scop în viață 169 00:08:01,950 --> 00:08:06,920 este de a citi dintr-un fișier stea Pointer conținutul unui fișier într-un tampon global 170 00:08:06,920 --> 00:08:09,000 că noi declarat la nivel global de mai sus [? principal. ?] 171 00:08:09,000 --> 00:08:12,649 Acesta este un complex pic pentru că noi Trebuie să citiți octeți din fișierul 172 00:08:12,649 --> 00:08:14,690 dar verifica pe fiecare iterație dacă ne-am deja 173 00:08:14,690 --> 00:08:17,600 lovit la sfârșitul fișierului sau altceva a mers prost. 174 00:08:17,600 --> 00:08:21,210 Și vom folosi realloc pentru a vă asigura că indiferent de tampon folosim este în creștere 175 00:08:21,210 --> 00:08:24,440 și în creștere și în creștere și mereu stau in partea din numărul de octeți 176 00:08:24,440 --> 00:08:25,675 că avem nevoie pentru a se potrivi acolo. 177 00:08:25,675 --> 00:08:27,550 Handler, între timp, este funcția care devine 178 00:08:27,550 --> 00:08:30,630 numit prin cale de a avea înregistrată control C ca un semnal 179 00:08:30,630 --> 00:08:32,140 pe care dorim să intercepteze. 180 00:08:32,140 --> 00:08:34,070 Observați aici în handler că în cele din urmă 181 00:08:34,070 --> 00:08:36,780 solicită opri, care, desigur, oprește serverul de web. 182 00:08:36,780 --> 00:08:39,750 Și, din păcate, căutare nu este pusă în aplicare. 183 00:08:39,750 --> 00:08:41,940 În spirit, aceasta este o Funcția destul de simplu. 184 00:08:41,940 --> 00:08:44,900 Având în vedere o extensie de fișier, are nevoie de pentru a reveni se așa-numitele MIME 185 00:08:44,900 --> 00:08:46,320 tip sau tip de conținut. 186 00:08:46,320 --> 00:08:49,260 Și am să precizeze în caietul de sarcini ceea ce trebuie să fie cea de cartografiere. 187 00:08:49,260 --> 00:08:52,330 Dar trebuie să traduce se în cele din urmă cu codul C. 188 00:08:52,330 --> 00:08:56,490 >> Următorul este funcția noastră la fel de miez numit parse, al cărui scop în viață 189 00:08:56,490 --> 00:08:59,350 este de a citi, nu dintr-un fișier, ci de la o conexiune la rețea. 190 00:08:59,350 --> 00:09:03,510 Mai exact, citind și parsarea Cerere HTTP care a venit dintr-un browser 191 00:09:03,510 --> 00:09:05,940 la server, astfel încât în cele din urmă, putem analiza 192 00:09:05,940 --> 00:09:09,530 la doar antetele din cererea de line și să se întoarcă pe cei la tine 193 00:09:09,530 --> 00:09:12,720 prin intermediul unui tampon globală care am declarat mai sus [? principal. ?] 194 00:09:12,720 --> 00:09:14,880 >> Reset, între timp, este o funcție care definim 195 00:09:14,880 --> 00:09:18,730 că este chemat iterativ interior de principal de fiecare dată când ești pe cale 196 00:09:18,730 --> 00:09:20,799 gata să înceapă de ascultare pentru o nouă conexiune 197 00:09:20,799 --> 00:09:22,840 astfel încât să știm mereu starea de variabilele 198 00:09:22,840 --> 00:09:24,870 și astfel încât ne-am, de asemenea, eliberat orice amintire care 199 00:09:24,870 --> 00:09:28,070 ar fi fost alocate pentru o conexiune la rețea anterior. 200 00:09:28,070 --> 00:09:30,060 Următorul este pornește, funcție care am scris 201 00:09:30,060 --> 00:09:31,920 care conține un întreg mulțime de cod de rețea 202 00:09:31,920 --> 00:09:34,420 care incep in cele din urma serverul de web. 203 00:09:34,420 --> 00:09:36,680 >> Ultima sus este funcția numita oprire, care 204 00:09:36,680 --> 00:09:38,770 face exact acest lucru, oprește serverul de web. 205 00:09:38,770 --> 00:09:42,270 Dar mai întâi se eliberează nici o amintire care încă au fost alocate. 206 00:09:42,270 --> 00:09:45,850 Dar în cele din urmă solicită ieșire chiar și fără returnarea de control 207 00:09:45,850 --> 00:09:47,480 funcției nostru principal. 208 00:09:47,480 --> 00:09:49,480 În cele din urmă, unul dintre majoritatea tehnicilor importante 209 00:09:49,480 --> 00:09:52,680 la punerea în aplicare acest server web este Va fi un pic de studiu și de eroare, 210 00:09:52,680 --> 00:09:55,886 având una browser fereastră deschisă la dreapta și o fereastră terminal la 211 00:09:55,886 --> 00:09:57,760 stânga, consola servere fereastră, astfel încât să 212 00:09:57,760 --> 00:10:00,420 Puteti vedea mesajele care sunt fiind afișate pe ecran. 213 00:10:00,420 --> 00:10:04,170 >> Dar mai bine ar fi un al treilea fereastră, o fereastră terminal al doilea, 214 00:10:04,170 --> 00:10:07,135 în care utilizați Telnet, utilizarea pentru care este prescris în spec. 215 00:10:07,135 --> 00:10:09,640 Și Telnet este doar o foarte Programul rețea simplu 216 00:10:09,640 --> 00:10:12,660 care vă permite să pretinde la fi un browser intr-unul fereastră 217 00:10:12,660 --> 00:10:14,540 în timp ce vorbesc la cealaltă fereastră. 218 00:10:14,540 --> 00:10:16,830 În acest fel puteți vedea exact comenzile textuale 219 00:10:16,830 --> 00:10:18,700 care se întorc de la server la client 220 00:10:18,700 --> 00:10:20,810 fără a fi nevoie să poking în jurul valorii de dezvoltator Chrome 221 00:10:20,810 --> 00:10:24,010 Unelte într-un alt mod interfață clunkier. 222 00:10:24,010 --> 00:10:29,099