1 00:00:00,000 --> 00:00:00,390 2 00:00:00,390 --> 00:00:02,931 >> DAVID MALAN: Nå la oss ta en ser på den faktiske fordelingen 3 00:00:02,931 --> 00:00:04,310 kode i filen som heter server.c. 4 00:00:04,310 --> 00:00:06,690 Nå må du huske på at dette filens ganske stort denne uken. 5 00:00:06,690 --> 00:00:09,922 Det er over 1000 linjer med kode, men de fleste av disse linjene vi har skrevet. 6 00:00:09,922 --> 00:00:11,880 Og hva vi har igjen er noen blanks som du vil 7 00:00:11,880 --> 00:00:15,088 må fylle ut for å legge til noen av de mest oppsiktsvekkende funksjoner av webserveren 8 00:00:15,088 --> 00:00:16,300 å faktisk få det i gang. 9 00:00:16,300 --> 00:00:18,890 Faktisk, hvis du kjører distribusjon kode etter kompilering det 10 00:00:18,890 --> 00:00:21,400 du vil finne at webserveren gjør ikke så mye. 11 00:00:21,400 --> 00:00:24,585 I stedet får brukeren en 501, ikke implementert, feilmelding. 12 00:00:24,585 --> 00:00:27,210 Men det bør være fornuftig fordi vi har faktisk ikke implementert 13 00:00:27,210 --> 00:00:28,565 all sin funksjonalitet. 14 00:00:28,565 --> 00:00:29,940 Så la oss ta en titt på server.c. 15 00:00:29,940 --> 00:00:32,500 Og vil du ønsker å gå over dette i en litt mer detaljert 16 00:00:32,500 --> 00:00:34,200 litt saktere, i ditt eget tempo. 17 00:00:34,200 --> 00:00:36,616 Men for nå la meg prøve å veilede deg gjennom det å gi deg 18 00:00:36,616 --> 00:00:39,230 en følelse av hva som er nyttig å vet, hva som er mindre nyttig å vite, 19 00:00:39,230 --> 00:00:41,212 slik at du kan veilede din egen leting. 20 00:00:41,212 --> 00:00:44,170 Så på toppen av server.c, selvfølgelig, vi har en hel haug med definerer. 21 00:00:44,170 --> 00:00:46,130 I tillegg til en hel haug med inneholder. 22 00:00:46,130 --> 00:00:49,610 Verdt å merke seg er at vi har noen få globale konstanter her, 23 00:00:49,610 --> 00:00:52,680 som vi bruker i vår kode for å gjøre sikker på at visse arrays er 24 00:00:52,680 --> 00:00:53,780 av tilstrekkelig lengde. 25 00:00:53,780 --> 00:00:58,020 Basert på hvor lenge HTTP-forespørsler vi forvente å bli mottatt, potensielt, 26 00:00:58,020 --> 00:00:59,860 fra web-klienter, eller nettlesere. 27 00:00:59,860 --> 00:01:04,000 >> I mellomtiden, la oss rulle ned her, til én type definisjon. 28 00:01:04,000 --> 00:01:07,430 Legg merke til at akkurat som i P satt 4, hvor vi spilte med fil I / O, 29 00:01:07,430 --> 00:01:09,680 på samme måte her, vi er spiller med mye bytes. 30 00:01:09,680 --> 00:01:11,490 Og så har vi typedeffed char å være en byte. 31 00:01:11,490 --> 00:01:16,260 Med andre ord, den datatype, kapital B-y-t-e, ikke finnes som standard i C. 32 00:01:16,260 --> 00:01:20,090 Så vi har laget det som et synonym for røye, slik at vi har noen 8-bits verdi 33 00:01:20,090 --> 00:01:21,041 som å arbeide. 34 00:01:21,041 --> 00:01:23,540 Nå er det en hel haug med prototyper her, noen som 35 00:01:23,540 --> 00:01:26,581 er for funksjoner du vil skrive, men de fleste av dem vi har skrevet selv. 36 00:01:26,581 --> 00:01:29,430 La oss bla ned nå til slutt, bare noen få globale variabler. 37 00:01:29,430 --> 00:01:32,036 En er dette røye stjerne, AKA roten. 38 00:01:32,036 --> 00:01:34,660 Faktisk, vil du legge merke til at vi ikke er bruke CS50 biblioteket lenger. 39 00:01:34,660 --> 00:01:36,330 Så vi i stedet bare bruker røye stjerne. 40 00:01:36,330 --> 00:01:38,960 Og rot kommer til å være en peker til strengen som 41 00:01:38,960 --> 00:01:41,700 representerer roten til serveren. 42 00:01:41,700 --> 00:01:44,030 Så, for eksempel, når jeg kjørte kommandoen tidligere 43 00:01:44,030 --> 00:01:48,100 og spesifisert roten til "offentlig", som katalog innsiden av fordelings 44 00:01:48,100 --> 00:01:48,800 kode. 45 00:01:48,800 --> 00:01:52,160 Root, her, ville være en peker til akkurat strengen, "offentlig". 46 00:01:52,160 --> 00:01:57,830 Eller egentlig hele banen / home / ubuntu / så videre til at offentlig katalog. 47 00:01:57,830 --> 00:02:01,930 >> I mellomtiden, i tråd 67 her, har vi det som kalles fildeskriptorer. 48 00:02:01,930 --> 00:02:05,329 Disse ligner i ånden til fil stjerners pekere. 49 00:02:05,329 --> 00:02:07,370 Men det viser seg at det er et annet sett av funksjoner 50 00:02:07,370 --> 00:02:11,050 du kan bruke med å lese filer eller lesing fra nettverkstilkoblinger. 51 00:02:11,050 --> 00:02:13,280 Som en web server web lesertilkobling som 52 00:02:13,280 --> 00:02:16,480 faktisk bare bruker heltall i stedet pekere, som vi så på P satt fire. 53 00:02:16,480 --> 00:02:17,530 Men det er den samme ideen. 54 00:02:17,530 --> 00:02:21,180 Og jeg har gjort disse global å holde styr på en klient fil descriptor. 55 00:02:21,180 --> 00:02:22,960 Som en peker til hjemmesiden min klient. 56 00:02:22,960 --> 00:02:24,212 Og en server fil descriptor. 57 00:02:24,212 --> 00:02:27,170 Sortering av en peker til webserveren, men de er faktisk ikke pekere, 58 00:02:27,170 --> 00:02:28,360 de er bare tall. 59 00:02:28,360 --> 00:02:30,940 >> Til slutt har vi denne globale variabel her kalt signalisert. 60 00:02:30,940 --> 00:02:32,690 Som er min måte, sant eller usant, for å holde 61 00:02:32,690 --> 00:02:35,450 rede på hvorvidt brukeren har signalisert at han eller hun ønsker 62 00:02:35,450 --> 00:02:36,680 å stoppe webserveren. 63 00:02:36,680 --> 00:02:39,690 Og ja, det er en funksjon som lytter for kontroll C. 64 00:02:39,690 --> 00:02:43,650 Slik at hvis du som bruker, vil drepe serveren ved å trykke Kontroll C, 65 00:02:43,650 --> 00:02:46,279 at boolsk variabel du vil se i koden er satt til true. 66 00:02:46,279 --> 00:02:49,070 Og deretter innen en sløyfe holder vi å kontrollere verdien av denne variabel. 67 00:02:49,070 --> 00:02:52,560 Og hvis det er sant, vi bare avslutte programmet helt. 68 00:02:52,560 --> 00:02:54,050 >> La oss nå ta en titt på hoved. 69 00:02:54,050 --> 00:02:56,050 Du trenger ikke å forstå alt i hoved, 70 00:02:56,050 --> 00:02:58,030 men la oss gi deg en følelse av den totale arbeidsflyten. 71 00:02:58,030 --> 00:03:00,571 Og deretter ta en nærmere titt deg selv på noen av kommentarene. 72 00:03:00,571 --> 00:03:02,410 For det første, frem gjennom hoved, 73 00:03:02,410 --> 00:03:04,050 vi analysere kommandolinjeargumentene. 74 00:03:04,050 --> 00:03:06,360 Det viser seg at hoved er skal forvente enten dash 75 00:03:06,360 --> 00:03:09,700 h om hjelp, som bare forteller deg hvordan å kjøre programmet veldig konsist. 76 00:03:09,700 --> 00:03:12,000 Eller dash p, som lar du angir en port. 77 00:03:12,000 --> 00:03:14,550 Men igjen, ved hjelp av port 80 80, som standard, 78 00:03:14,550 --> 00:03:16,940 er hva du bør bruke CS 50 IDE. 79 00:03:16,940 --> 00:03:18,800 >> Neste, vi bare gjøre noen feilsjekking. 80 00:03:18,800 --> 00:03:20,650 Å sørge for at den portverdien er faktisk 81 00:03:20,650 --> 00:03:22,770 som vi forventer, innenfor et bestemt område. 82 00:03:22,770 --> 00:03:24,630 Og så litt av magien begynner. 83 00:03:24,630 --> 00:03:26,930 Vi kaller denne funksjonen starte, som vi skrev. 84 00:03:26,930 --> 00:03:31,360 Vi passerer inn med port, som samt eventuelle valgfrie argumenter 85 00:03:31,360 --> 00:03:33,770 for å starte serveren. 86 00:03:33,770 --> 00:03:35,830 Nærmere bestemt, at portnummer. 87 00:03:35,830 --> 00:03:39,750 >> Greit, neste, er dette ganske kryptisk kode som du ikke vil se for ofte, 88 00:03:39,750 --> 00:03:43,170 men det er en fancy måte å fortelle programmet til å lytte etter et signal. 89 00:03:43,170 --> 00:03:46,200 Et signal å være noe som en spesiell tastetrykk, som kontroll C. 90 00:03:46,200 --> 00:03:50,010 Så denne koden her er hvordan vi registrerer det som kalles en hendelse lytteren. 91 00:03:50,010 --> 00:03:54,420 Hvor og når som helst brukeren treffer Kontroll C denne koden forteller datamaskinen 92 00:03:54,420 --> 00:03:56,200 å kjøre en funksjon som heter handler. 93 00:03:56,200 --> 00:03:59,844 Som er skrevet lavere ned, implementert senke ned i denne filen, server.c, 94 00:03:59,844 --> 00:04:01,260 som stopper programmet helt. 95 00:04:01,260 --> 00:04:04,060 Men ingen grunn til å bekymre de indre detaljene der. 96 00:04:04,060 --> 00:04:06,010 >> La oss nå fokusere på den indre løkken. 97 00:04:06,010 --> 00:04:09,164 Ja, hva webserveren gjør er bevisst looping uendelig. 98 00:04:09,164 --> 00:04:12,080 Fordi etter alt det er ganske mye hva du vil ha en web server til å gjøre. 99 00:04:12,080 --> 00:04:13,910 Inntil du eksplisitt stoppe det, du bare ønsker 100 00:04:13,910 --> 00:04:15,660 å bli sittende der effektivt i en løkke, 101 00:04:15,660 --> 00:04:17,970 venter på noen på Internett for å koble til det. 102 00:04:17,970 --> 00:04:20,519 Slik at webserveren kan deretter svare på noen forespørsel. 103 00:04:20,519 --> 00:04:22,780 >> Legg merke til nå på toppen av programmet I fri 104 00:04:22,780 --> 00:04:26,030 noen variabler, fordi senere vil du ser vi bruker malloc noen steder. 105 00:04:26,030 --> 00:04:27,988 Så jeg vil bare gjøre at alle mine variabler 106 00:04:27,988 --> 00:04:30,487 er initialisert til noen kjente verdier. 107 00:04:30,487 --> 00:04:32,820 Ned her jeg sjekke om Programmet har blitt signalisert. 108 00:04:32,820 --> 00:04:35,944 Med andre ord, hvis brukeren treffer kontroll C, la oss bare slutte med denne sløyfen 109 00:04:35,944 --> 00:04:37,150 ved å ringe stopp. 110 00:04:37,150 --> 00:04:40,060 >> Og så nå denne koden blir litt mer interessant. 111 00:04:40,060 --> 00:04:42,460 Men legg merke til at du ikke har å skrive noe i main. 112 00:04:42,460 --> 00:04:44,760 Snarere innsiden av hoved Vi gjør følgende. 113 00:04:44,760 --> 00:04:47,520 Hvis brukeren har connected-- Dette er en funksjon vi skrev 114 00:04:47,520 --> 00:04:48,880 som returnerer sant eller usant. 115 00:04:48,880 --> 00:04:51,760 Og hver gang det heter det bare sier, ja, en klient, 116 00:04:51,760 --> 00:04:53,550 en browser har koblet til serveren. 117 00:04:53,550 --> 00:04:54,660 Eller, nei, det har ikke det. 118 00:04:54,660 --> 00:04:57,820 Og på denne måten kan vi bare sløyfe uendelig venter på ekte 119 00:04:57,820 --> 00:04:59,610 som skal returneres av den funksjonen. 120 00:04:59,610 --> 00:05:02,590 >> I mellomtiden, dette neste funksjon, forespørsel, vi også skrev for deg. 121 00:05:02,590 --> 00:05:07,160 Dette tar det som er inni som virtuell konvolutt, den såkalte HTTP 122 00:05:07,160 --> 00:05:10,180 be om, og faktisk analyserer det så å si. 123 00:05:10,180 --> 00:05:13,260 Ser på det topp til bunn, venstre til høyre, og laster 124 00:05:13,260 --> 00:05:14,620 alle disse innledende linjer. 125 00:05:14,620 --> 00:05:17,250 Som get linje og noe annet under den, 126 00:05:17,250 --> 00:05:19,230 inn i en variabel som vi har kalt meldingen. 127 00:05:19,230 --> 00:05:20,590 For en HTTP-melding. 128 00:05:20,590 --> 00:05:23,234 Og vi har også lastet dens lengde i lengden. 129 00:05:23,234 --> 00:05:24,400 Nå er dette litt annerledes. 130 00:05:24,400 --> 00:05:25,650 Så la oss ta en rask titt på dette. 131 00:05:25,650 --> 00:05:27,110 Selv om du ikke gjør det må gjennomføre anmodningen, 132 00:05:27,110 --> 00:05:29,610 det er nyttig, kanskje, for å forstå hvordan det fungerer. 133 00:05:29,610 --> 00:05:33,450 Denne forespørselen funksjonen tilsynelatende tar i to argumenter, melding 134 00:05:33,450 --> 00:05:33,960 og lengde. 135 00:05:33,960 --> 00:05:38,400 Men merker at jeg har bestått i en Ampersand til både melding og lengde. 136 00:05:38,400 --> 00:05:42,100 Men hvis vi bla opp, hva er meldingen og lengde? 137 00:05:42,100 --> 00:05:44,795 >> Vel merker at meldingen og Lengden er deklarert inne 138 00:05:44,795 --> 00:05:47,900 av hoved å være en char stjerne. 139 00:05:47,900 --> 00:05:49,170 Og en størrelse t. 140 00:05:49,170 --> 00:05:51,710 Som egentlig bare en int, henholdsvis. 141 00:05:51,710 --> 00:05:55,830 Så hva er nysgjerrig her, skjønt, er at hvis meldingen er en char stjerne 142 00:05:55,830 --> 00:06:01,160 men jeg har bestått i tegnet av melding, som er typen som tech 143 00:06:01,160 --> 00:06:04,475 får adressen til en peker. 144 00:06:04,475 --> 00:06:06,550 En dobbel pekeren, hvis du vil. 145 00:06:06,550 --> 00:06:08,740 >> Og faktisk, hvis jeg blar nedover. 146 00:06:08,740 --> 00:06:13,470 Helt ned i denne filen, der forespørselen er faktisk blir gjennomført, 147 00:06:13,470 --> 00:06:16,770 Jeg kommer til å se følgende signatur, eller prototype, 148 00:06:16,770 --> 00:06:17,520 for denne funksjonen. 149 00:06:17,520 --> 00:06:19,580 Som du har sikkert ikke sett før. 150 00:06:19,580 --> 00:06:21,180 Forespørselen funksjonen returnerer en bool. 151 00:06:21,180 --> 00:06:22,430 Det er sikkert kjent. 152 00:06:22,430 --> 00:06:23,830 Men legg merke til det første argumentet. 153 00:06:23,830 --> 00:06:26,329 Det kalles budskap, men jeg kunne ha kalt det noe her. 154 00:06:26,329 --> 00:06:27,575 Men det er røye star star. 155 00:06:27,575 --> 00:06:29,420 >> Og dette er en slags pene ting. 156 00:06:29,420 --> 00:06:33,620 Fordi jeg vil ha denne funksjonen be om å tildele minne 157 00:06:33,620 --> 00:06:37,250 for uansett hvor stor den HTTP-forespørsel er i den virtuelle konvolutt 158 00:06:37,250 --> 00:06:41,670 den mottar fra nettleseren, jeg ønsker å være i stand til å returnere en streng. 159 00:06:41,670 --> 00:06:43,820 Men jeg ønsker også å være i stand til å returnere en lengde. 160 00:06:43,820 --> 00:06:46,470 Så som du vil se i spesifikasjon, C, selvfølgelig, 161 00:06:46,470 --> 00:06:47,850 kan ikke returnere flere verdier. 162 00:06:47,850 --> 00:06:49,860 Og faktisk er jeg bare returnerer en bool her. 163 00:06:49,860 --> 00:06:51,860 Men akkurat som vi så i forelese en stund tilbake deg 164 00:06:51,860 --> 00:06:57,920 kan returnere to verdier hvis du passere i to verdier som referanse. 165 00:06:57,920 --> 00:06:59,110 Eller med pekeren. 166 00:06:59,110 --> 00:07:03,190 Slik at du faktisk kan gå til disse adressene, sette verdier der, 167 00:07:03,190 --> 00:07:05,580 og effektivt via denne tilbake kanal, så å si, 168 00:07:05,580 --> 00:07:08,880 kan en funksjon retur flere verdier til den som ringer. 169 00:07:08,880 --> 00:07:12,240 >> I dette tilfelle forespørselen kan returnere tre verdier. 170 00:07:12,240 --> 00:07:14,140 Dens faktiske returtype, en bool. 171 00:07:14,140 --> 00:07:16,490 Meldingen, en char star star. 172 00:07:16,490 --> 00:07:18,590 Og lengde, en størrelse t. 173 00:07:18,590 --> 00:07:19,810 Som er bare en int. 174 00:07:19,810 --> 00:07:23,100 Fordi denne funksjonen forespørsel kan gå til adressen lengde 175 00:07:23,100 --> 00:07:24,340 og sette en verdi der. 176 00:07:24,340 --> 00:07:26,970 Og det kan gå til adressen budskap og sette en verdi der. 177 00:07:26,970 --> 00:07:28,380 Og at nå bør være fornuftig. 178 00:07:28,380 --> 00:07:32,740 >> Fordi selv om meldingen er en char star, så snart 179 00:07:32,740 --> 00:07:37,156 du går det med stjerne melding, som vi har sett før i kode, 180 00:07:37,156 --> 00:07:38,280 hva har du tenkt å finne? 181 00:07:38,280 --> 00:07:41,030 Du kommer til å finne venter på du der, en del av minnet som 182 00:07:41,030 --> 00:07:43,200 bør være en char stjerne. 183 00:07:43,200 --> 00:07:44,414 Eller adressen til en streng. 184 00:07:44,414 --> 00:07:47,330 Og det er OK hvis du ikke helt wrap tankene rundt det for fort. 185 00:07:47,330 --> 00:07:51,470 Men tenk på at alt vi gjør tar adressen til en peker 186 00:07:51,470 --> 00:07:53,980 slik at vi kan gå dit og faktisk sette en peker der. 187 00:07:53,980 --> 00:07:56,510 Men ikke bekymre deg om det ikke helt synke akkurat nå. 188 00:07:56,510 --> 00:07:59,080 Vet for nå som forespørsel fungere effektivt 189 00:07:59,080 --> 00:08:00,800 gir deg disse tre verdier. 190 00:08:00,800 --> 00:08:02,290 >> Så la oss nå gå tilbake til hovedsiden. 191 00:08:02,290 --> 00:08:06,570 Hva som skjer neste, i Hoved, er følgende. 192 00:08:06,570 --> 00:08:12,020 Når jeg har fått innsiden av melding og lengde, de to verdiene jeg bryr meg om. 193 00:08:12,020 --> 00:08:14,340 Så går vi videre og skrive noen kode for deg som 194 00:08:14,340 --> 00:08:16,807 kan du lese bare den første linjen. 195 00:08:16,807 --> 00:08:18,640 Den såkalte forespørsel linje fra forespørselen. 196 00:08:18,640 --> 00:08:23,880 Nærmere bestemt, noe som get / HTTP 1.1, og ikke noe mer. 197 00:08:23,880 --> 00:08:26,200 Så det er en hel haug med andre HTTP-hoder, husker, 198 00:08:26,200 --> 00:08:28,680 at en nettleser sender fra en klient til en server. 199 00:08:28,680 --> 00:08:31,790 Vi bare ignorerer alle dem slik at alt du ser på terminalvinduet, 200 00:08:31,790 --> 00:08:38,559 husker, er bare noe lignende, get / hello.HTML HTP / 1.1. 201 00:08:38,559 --> 00:08:41,182 >> Så oppdager imidlertid at disse triks vi gjør her 202 00:08:41,182 --> 00:08:43,890 kommer til å være nyttig, kanskje, i ditt eget analysefunksjon som 203 00:08:43,890 --> 00:08:44,934 du vil gjennomføre. 204 00:08:44,934 --> 00:08:46,850 Legg merke til hvordan det er jeg bare erklære en variabel. 205 00:08:46,850 --> 00:08:49,650 Skjer for å være konst, som betyr, Jeg lover å ikke endre dette. 206 00:08:49,650 --> 00:08:50,720 Kalt høystakken. 207 00:08:50,720 --> 00:08:52,860 Så jeg cleverly oppkalt min neste variabel nål, 208 00:08:52,860 --> 00:08:56,130 slik at jeg kan proverbially se etter en nål i en høystakk, 209 00:08:56,130 --> 00:08:58,530 ved hjelp av en super hendig funksjon kalt str str. 210 00:08:58,530 --> 00:09:02,860 S-T-R-S-T-R, som i og for dens menneske side, eller per reference.CS50.NET, 211 00:09:02,860 --> 00:09:05,220 lar deg søke etter en streng i et annet. 212 00:09:05,220 --> 00:09:08,770 Og dette er min måte søker etter slutten av en linje 213 00:09:08,770 --> 00:09:11,750 slik at jeg kan faktisk lese bare en linje i minnet. 214 00:09:11,750 --> 00:09:14,860 >> Samtidig merker på linje 176 her, jeg faktisk 215 00:09:14,860 --> 00:09:17,010 allokere nok minne for den linjen. 216 00:09:17,010 --> 00:09:21,350 Og så bruker str og kopiere, og ved hjelp av bare en stråle brakett notasjon, 217 00:09:21,350 --> 00:09:23,070 lagrer jeg på at array? 218 00:09:23,070 --> 00:09:24,926 Akkurat som første linje. 219 00:09:24,926 --> 00:09:28,050 Faktisk, la meg bare hoppe over raskt spesifikasjonen for Oppgavesettet 220 00:09:28,050 --> 00:09:28,550 seks. 221 00:09:28,550 --> 00:09:29,841 Har lest gjennom dette i detalj. 222 00:09:29,841 --> 00:09:32,190 Men hva vil du finne er denne linjen her. 223 00:09:32,190 --> 00:09:34,810 Der basert på spesifikasjonen den formelle definisjonen 224 00:09:34,810 --> 00:09:40,180 HTTP vi spesifisere hva det aller første linjen skal være fra hvilken som helst nettleser 225 00:09:40,180 --> 00:09:42,970 til en server på innsiden av denne såkalt virtuell konvolutt. 226 00:09:42,970 --> 00:09:46,390 >> Spesielt bør leseren nevne en metode, som en bli, 227 00:09:46,390 --> 00:09:47,830 eller post, eller lignende. 228 00:09:47,830 --> 00:09:50,610 Så bokstavelig talt en plass, her representert med bare sp 229 00:09:50,610 --> 00:09:54,110 slik at det er eksplisitt at vi virkelig vil ha en plass her. 230 00:09:54,110 --> 00:09:58,430 Deretter be om målet som vil være noe sånt som /hello.HTML. 231 00:09:58,430 --> 00:09:59,940 Etterfulgt av en annen plass. 232 00:09:59,940 --> 00:10:01,120 Etterfulgt av en versjon. 233 00:10:01,120 --> 00:10:04,300 Som ville være noe sånt som HTTP / 1.1. 234 00:10:04,300 --> 00:10:07,360 Etterfulgt av C-R-L-F. Som er en akronym du kommer til å se mye 235 00:10:07,360 --> 00:10:08,350 i beskrivelsen. 236 00:10:08,350 --> 00:10:11,810 Og dette er bare en fancy måte sier backslash r, backslash n. 237 00:10:11,810 --> 00:10:14,210 Med andre ord, vogn tilbake, ny linje. 238 00:10:14,210 --> 00:10:14,896 Eller linjeskift. 239 00:10:14,896 --> 00:10:16,020 Linjeskift, linjeskift. 240 00:10:16,020 --> 00:10:17,980 Det er det C-R-L-F betyr. 241 00:10:17,980 --> 00:10:20,180 >> Nå, i mellomtiden, hvis vi gå tilbake til vår kode, 242 00:10:20,180 --> 00:10:22,430 la oss se hva som gjenstår for deg å gjøre. 243 00:10:22,430 --> 00:10:26,350 Innsiden av hoved, endelig, det er et kall til en parse funksjon. 244 00:10:26,350 --> 00:10:30,670 Formålet med parse er å ta det aller første linje, der definisjonen vi 245 00:10:30,670 --> 00:10:34,590 bare så på spesifikasjonen, og trekke den såkalte absolutt sti 246 00:10:34,590 --> 00:10:35,420 og spørring. 247 00:10:35,420 --> 00:10:37,710 Nå tar en titt på spec for hva vi mener med det. 248 00:10:37,710 --> 00:10:41,380 >> Men på lang historie kort, denne tingen her, forespørsel målet, 249 00:10:41,380 --> 00:10:44,670 er en streng som kan være delt opp i to deler. 250 00:10:44,670 --> 00:10:47,680 Eller en absolutt bane som /hello.HTML. 251 00:10:47,680 --> 00:10:49,590 Etterfulgt av en valgfri spørsmålstegn. 252 00:10:49,590 --> 00:10:52,840 Og så noe sånt q lik katter, eller q er lik hunder, 253 00:10:52,840 --> 00:10:55,760 eller en rekke nøkkelverdi parene som vi så i forelesning 254 00:10:55,760 --> 00:10:59,420 å være en del av parametriseringen av en HTTP-forespørsel. 255 00:10:59,420 --> 00:11:02,150 >> Så hva du kommer til å trenge å gjøre er å implementere parse. 256 00:11:02,150 --> 00:11:05,790 Og finne ut hvordan å iterere over linje, som er akkurat det første argumentet 257 00:11:05,790 --> 00:11:06,890 at vi kjører i. 258 00:11:06,890 --> 00:11:09,270 Karakter for karakter for karakter. 259 00:11:09,270 --> 00:11:11,500 Bare kommer opp til slutten av strengen. 260 00:11:11,500 --> 00:11:15,430 Leter du etter det absolutt sti og leter etter dette søket. 261 00:11:15,430 --> 00:11:18,880 Og hva er fint om det faktum at vi har gitt deg i dokumentasjonen 262 00:11:18,880 --> 00:11:21,460 denne grammatiske definisjonen av den første linje, 263 00:11:21,460 --> 00:11:24,230 her du nødt til å finne ut, vel, hva er metoden. 264 00:11:24,230 --> 00:11:25,170 Er gyldig eller ikke? 265 00:11:25,170 --> 00:11:27,460 Og vi fortelle deg på spec når det er eller ikke er gyldig. 266 00:11:27,460 --> 00:11:29,120 Få, for eksempel, vil være gyldig. 267 00:11:29,120 --> 00:11:30,580 Plass vil være lett å se etter. 268 00:11:30,580 --> 00:11:34,460 Bare ved hjelp av uke to stil eller problem satt to-stil streng kontroll. 269 00:11:34,460 --> 00:11:35,710 Eller tegn sjekke. 270 00:11:35,710 --> 00:11:37,570 >> Forespørsel målet er tingen du kommer til å ønske å analysere. 271 00:11:37,570 --> 00:11:39,907 Så ta en titt på spec for hva som er forventet der. 272 00:11:39,907 --> 00:11:41,740 Og så til slutt, HTTP versjon, du bare ønsker 273 00:11:41,740 --> 00:11:44,931 å sørge for at det er blant de støttede versjoner som HTTP 1.1. 274 00:11:44,931 --> 00:11:47,430 Så egentlig et parse funksjons kommer til å være en mulighet 275 00:11:47,430 --> 00:11:50,013 å bare lese denne tingen karakter for tegn for tegn, 276 00:11:50,013 --> 00:11:53,900 eller streng ved streng, noe som gjør at at det samsvarer med denne spesifikasjonen. 277 00:11:53,900 --> 00:11:54,900 Greit, tilbake til hoved. 278 00:11:54,900 --> 00:11:55,858 La oss se hva som gjenstår. 279 00:11:55,858 --> 00:11:58,230 Så antar du har nå implementert din parse funksjon. 280 00:11:58,230 --> 00:12:01,500 Vi har analysert ut fra det såkalte absolutte banen og spørringen, 281 00:12:01,500 --> 00:12:03,520 hva betyr viktigste nå har å gjøre med dette? 282 00:12:03,520 --> 00:12:05,440 Vel, en, vil du se i koden som vi URL 283 00:12:05,440 --> 00:12:09,420 dekodes i tilfelle nettleseren har kodede enkelte spesialtegn 284 00:12:09,420 --> 00:12:12,670 og spesiell måte, vi går fremover og konvertere dem tilbake 285 00:12:12,670 --> 00:12:14,640 til de aktuelle ASCII-tegn. 286 00:12:14,640 --> 00:12:20,110 >> Så går vi videre og finne ut om brukeren har bedt /hello.HTML, 287 00:12:20,110 --> 00:12:21,859 hva filen gjør de egentlig? 288 00:12:21,859 --> 00:12:24,150 Med andre ord, vi må ta roten av serveren, 289 00:12:24,150 --> 00:12:27,550 at banen til offentlig katalog, og sette sammen den med noe sånt, 290 00:12:27,550 --> 00:12:28,840 hello.HTML. 291 00:12:28,840 --> 00:12:31,240 Slik at vi har en større streng som fører oss nøyaktig 292 00:12:31,240 --> 00:12:37,220 til selve hello.HTML filen på CS50 IDE harddisk, eller disk. 293 00:12:37,220 --> 00:12:39,730 >> Deretter kontrollerer vi at sti finnes faktisk. 294 00:12:39,730 --> 00:12:42,017 Ellers vi kaster en 404-feil for brukeren. 295 00:12:42,017 --> 00:12:43,850 Og, faktisk hele vår kode du vil se 296 00:12:43,850 --> 00:12:46,630 en rekke anvendelser av denne feilen funksjon som vi selv skrev, 297 00:12:46,630 --> 00:12:48,520 og spesifikasjonen leder deg gjennom. 298 00:12:48,520 --> 00:12:52,640 Dette er bare en måte å returnere noe annet enn 200 til brukeren. 299 00:12:52,640 --> 00:12:55,790 >> Nå her nede, jeg går videre og finne ut er hva brukeren 300 00:12:55,790 --> 00:12:58,670 har bedt om en fil eller en katalog. 301 00:12:58,670 --> 00:13:01,290 For hvis det er en katalog, jeg ønsker å gjøre et par ting. 302 00:13:01,290 --> 00:13:08,980 En, hvis brukeren besøker et URL som er for en katalog, 303 00:13:08,980 --> 00:13:11,920 men slutter ikke i en skråstrek, for konvensjonelle grunner, 304 00:13:11,920 --> 00:13:15,310 Jeg vil være sikker på at vi endrer URL til faktisk ende i en skråstrek. 305 00:13:15,310 --> 00:13:17,770 Og så vil du se i kilde kode som vi har gitt deg, 306 00:13:17,770 --> 00:13:21,980 vi tvinge brukeren til å omdirigere til ikke [? fu?], men [? fu /,?] hvis de har gjort 307 00:13:21,980 --> 00:13:22,480 at. 308 00:13:22,480 --> 00:13:24,440 Og se spesifikasjonen tilsvarende. 309 00:13:24,440 --> 00:13:26,120 >> I mellomtiden sjekker vi en annen ting. 310 00:13:26,120 --> 00:13:30,110 Hvis brukeren har besøkt en katalog og den katalogen 311 00:13:30,110 --> 00:13:35,240 inneholder en fil som heter index.html eller index.php, menneskelig konvensjonen 312 00:13:35,240 --> 00:13:37,840 vi ønsker ikke å vise dem innholdet i denne katalogen. 313 00:13:37,840 --> 00:13:41,990 Vi ønsker å vise dem innholdet av at standardfilen, index.html, 314 00:13:41,990 --> 00:13:43,640 eller index.php. 315 00:13:43,640 --> 00:13:45,750 Og så koden jeg har uthevet her samtaler 316 00:13:45,750 --> 00:13:48,430 en funksjon kalt indekser som bare sjekker, 317 00:13:48,430 --> 00:13:53,610 eksisterer det en fil i her heter index.html eller index.php. 318 00:13:53,610 --> 00:13:55,830 >> Ellers, hvis ingen av disse vilkår gjelder 319 00:13:55,830 --> 00:13:57,920 vi bare kaller funksjonen liste, som vi skrev, 320 00:13:57,920 --> 00:14:00,280 som bokstavelig talt viser innholdet i en katalog. 321 00:14:00,280 --> 00:14:03,680 Greit, og hva om forespørselen at brukerens nettleser har gjort 322 00:14:03,680 --> 00:14:05,830 er ikke for en katalog, men for en fil? 323 00:14:05,830 --> 00:14:07,980 Vel, først vi kaller et oppslag funksjon. 324 00:14:07,980 --> 00:14:10,750 Som kommer til å fortelle server, er dette et JPEG, er dette 325 00:14:10,750 --> 00:14:13,770 en HTML-fil, er dette en GIF, eller et annet format. 326 00:14:13,770 --> 00:14:17,300 Hvis ja, er det da kommer til å sjekk, vel, det er en PHP-fil. 327 00:14:17,300 --> 00:14:20,060 I så fall ønsker vi å kalle en funksjon heter tolker, som vi skrev, 328 00:14:20,060 --> 00:14:22,540 som tolker at PHP fil og spytter ut resultatene. 329 00:14:22,540 --> 00:14:24,941 Eller, mer overbevisende, hvis det er noe annet, 330 00:14:24,941 --> 00:14:26,690 la oss gå videre og bare overføre filen. 331 00:14:26,690 --> 00:14:29,680 I likhet med GIF eller JPEG fra serveren til brukeren, 332 00:14:29,680 --> 00:14:33,750 som om de ba om en HTML-side, bilde, eller en rekke andre ting. 333 00:14:33,750 --> 00:14:37,920 >> Til slutt, hvis ingenting annet ser ut til å arbeid, vi bare kommer til å si 501. 334 00:14:37,920 --> 00:14:42,190 Som er at 501, ikke implementert melding, noe som betyr at serveren 335 00:14:42,190 --> 00:14:44,230 er ennå ikke fullført.