1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 SPRECHER: Lassen Sie uns nun Tauch in den Verteilercode 3 00:00:11,730 --> 00:00:14,470 und werfen Sie einen Blick auf den Kontext , in dem der Code, den Sie schreiben, 4 00:00:14,470 --> 00:00:15,780 wird sich in Betrieb sein. 5 00:00:15,780 --> 00:00:17,350 Am Ende des Tages, Sie gehen zu implementieren sind 6 00:00:17,350 --> 00:00:18,710 die Gesamtheit des Webservers. 7 00:00:18,710 --> 00:00:20,460 Aber wir zur Verfügung gestellt haben Sie mit dem Skelett 8 00:00:20,460 --> 00:00:24,090 Code, der einige Funktionen haben, besonders in Verbindung mit Vernetzung. 9 00:00:24,090 --> 00:00:25,390 Lassen Sie uns einen Blick. 10 00:00:25,390 --> 00:00:27,560 >> Also hier nach oben der Datei ist ein Bündel 11 00:00:27,560 --> 00:00:30,020 der Funktion erforderliche Makros. 12 00:00:30,020 --> 00:00:33,570 Nun, das ist nur eine Funktion von c, wobei nach einer Reihe von Handbuchseiten 13 00:00:33,570 --> 00:00:36,410 müssen Sie einige definieren diese Konstanten wahr zu sein 14 00:00:36,410 --> 00:00:39,920 oder sogar bestimmte Zahlen, so dass sein haben Sie Zugriff auf bestimmte Funktionen. 15 00:00:39,920 --> 00:00:42,470 Ansonsten werden sie nicht deklariert werden, werden und Sie haben keinen Zugriff. 16 00:00:42,470 --> 00:00:45,340 Also habe ich diese im Wege erfolgen lesen die Handbuchseiten. 17 00:00:45,340 --> 00:00:48,410 Nun da unten, in Zeilen 15 bis 17, wir 18 00:00:48,410 --> 00:00:50,550 haben eine ganze Reihe von Grenzen erklärt. 19 00:00:50,550 --> 00:00:53,370 >> Und wir haben diese von einem geliehenen beliebteste Web-Server Apache genannt. 20 00:00:53,370 --> 00:00:54,650 Und das sind nur Zahlen, die gehen, 21 00:00:54,650 --> 00:00:56,810 die Gesamtzahl der Kappe von Bytes, die erlaubt sind 22 00:00:56,810 --> 00:01:01,930 in verschiedenen Zusammenhängen für die HTTP-Anforderung dass ein Browser erlaubt mir zu schicken. 23 00:01:01,930 --> 00:01:04,310 Als nächstes definieren wir Bytes. 24 00:01:04,310 --> 00:01:07,790 Jetzt ein Oktett ist nur eine andere Art zu sagen, ein Byte oder acht Bits. 25 00:01:07,790 --> 00:01:10,720 Stellt sich heraus, in vergangenen Zeiten ein Byte nicht unbedingt acht Bits, 26 00:01:10,720 --> 00:01:12,339 so Oktett ist immer acht Bits. 27 00:01:12,339 --> 00:01:14,880 Also in diesem Fall wir angenommen haben was häufig in der Vernetzung 28 00:01:14,880 --> 00:01:17,410 Welt der Aufruf acht Byte ein Oktett. 29 00:01:17,410 --> 00:01:21,840 >> Hier habe ich die Oktett wird angegeben 512 sein, so dass ähnlich wie in der Forensik 30 00:01:21,840 --> 00:01:24,170 wenn wir ein paar lesen Bytes auf einmal, auch hier, 31 00:01:24,170 --> 00:01:27,390 wir werden ein Lese Bündel von Oktetten zu einem Zeitpunkt. 32 00:01:27,390 --> 00:01:28,922 Nächstes eine ganze Reihe von Header-Dateien. 33 00:01:28,922 --> 00:01:30,255 Wie wusste ich zu ihnen gehören? 34 00:01:30,255 --> 00:01:32,730 Nun lese ich einfach den Mann Seiten für eine Anzahl von Funktionen 35 00:01:32,730 --> 00:01:35,620 dass wir in dieser Distribution verwenden Code und sind in die, 36 00:01:35,620 --> 00:01:37,390 Ich wurde angewiesen. 37 00:01:37,390 --> 00:01:39,090 >> Und jetzt haben wir einen Datentyp. 38 00:01:39,090 --> 00:01:41,470 Wir haben ein Oktett erklärt ein Zeichen sein. 39 00:01:41,470 --> 00:01:44,040 Und wir werden später sehen, dass das ist, in der gesamten Code. 40 00:01:44,040 --> 00:01:45,670 Und wir erklärt haben, eine ganze Reihe von Prototypen, 41 00:01:45,670 --> 00:01:47,961 und wir werden schnell durch zu gehen Jede dieser Funktionen. 42 00:01:47,961 --> 00:01:50,400 Schließlich und vielleicht am wichtig zu halten 43 00:01:50,400 --> 00:01:52,520 dagegen an diesem Punkt in die Geschichte ist, dass es 44 00:01:52,520 --> 00:01:54,520 sind in der Tat eine ganze Haufen von globalen Variablen 45 00:01:54,520 --> 00:02:00,430 am Anfang der Datei, Wurzel, CFD, SFD, Anfrage, Datei-und Körper. 46 00:02:00,430 --> 00:02:03,960 >> Jetzt in der Regel, mit so vielen globalen Variablen oder globalen Variablen überhaupt, 47 00:02:03,960 --> 00:02:05,280 ist nicht die Praxis zurück. 48 00:02:05,280 --> 00:02:09,090 Aber es stellt sich heraus, die wir auch mit ein Technik namens Signalverarbeitung später 49 00:02:09,090 --> 00:02:11,930 im Code, die es uns erlaubt zu erkennen, wenn der Benutzer etwas trifft 50 00:02:11,930 --> 00:02:15,080 wie CTRL C heruntergefahren der Server ordnungsgemäß. 51 00:02:15,080 --> 00:02:18,240 Und um das zu tun, anmutig und tatsächlich freie Speicherplatz, 52 00:02:18,240 --> 00:02:20,800 wir brauchen, um Zugang zu haben diese globale Variablen. 53 00:02:20,800 --> 00:02:24,510 >> Und nun schauen Sie sich Haupt, lassen die treibt die Gesamtheit des Programms. 54 00:02:24,510 --> 00:02:27,720 Zuerst wird in hier oben haben wir eine Fehlernummer variable 55 00:02:27,720 --> 00:02:29,570 daß offenbar nicht eine Art, aber das ist 56 00:02:29,570 --> 00:02:31,500 denn es ist tatsächlich in der Datei definiert 57 00:02:31,500 --> 00:02:34,800 Fehler errno.h die ist höher enthalten. 58 00:02:34,800 --> 00:02:38,780 Wenn Sie Menschen errno auf tatsächlich tun siehe Definition für diese Sache, 59 00:02:38,780 --> 00:02:41,230 Sie werden sehen, dass dies ein spezielle globale Variable, 60 00:02:41,230 --> 00:02:43,350 wird durch eine ganze Reihe gesetzt Funktionsumfang nicht geschrieben 61 00:02:43,350 --> 00:02:48,730 von uns, sondern von den Autoren der Linux und andere Systeme, um tatsächlich eingestellt 62 00:02:48,730 --> 00:02:52,400 eine Zahl, die die Variable, wenn etwas schief geht, so dass Sie global 63 00:02:52,400 --> 00:02:54,830 herauszufinden, was ging schief. 64 00:02:54,830 --> 00:02:58,540 >> Jetzt unten finden Sie eine neue sehen werden Technik vielleicht mit getopt, 65 00:02:58,540 --> 00:03:01,790 eine Funktion, die parse Befehl hilft Zeilenargumente, so dass wir es nicht tun 66 00:03:01,790 --> 00:03:05,540 müssen Zeitverschwendung Mühe herauszufinden herauszufinden, wie man so etwas wie 8080 zu analysieren, 67 00:03:05,540 --> 00:03:08,350 oder Bindestrich p oder Bindestrich h um Hilfe zu holen. 68 00:03:08,350 --> 00:03:10,300 getopt Wesentlichen bedeutet das für uns. 69 00:03:10,300 --> 00:03:11,750 Siehe Manpage für mehr. 70 00:03:11,750 --> 00:03:13,960 >> Als nächstes wollen wir ein wenig Fehler Überprüfung, um sicherzustellen, 71 00:03:13,960 --> 00:03:17,420 , dass die Port-Nummer ist innerhalb der angegebene Bereich in der spec. 72 00:03:17,420 --> 00:03:20,240 Weiter sehen wir einen Aufruf der Funktion beginnen, deren Definition wir 73 00:03:20,240 --> 00:03:24,040 sehen in einem Moment, und wie der Name schon sagt, dies startet den Web-Server. 74 00:03:24,040 --> 00:03:26,960 Ein Aufruf einer Funktion Hier haben wir genannte Signal, das sagt, 75 00:03:26,960 --> 00:03:30,750 ob und wann Sie Steuerung C aus hören Tastatur des Benutzers, gehen Sie vor und nennen 76 00:03:30,750 --> 00:03:34,650 eine Funktion namens Handler, die gehen letztlich aufräumen und stoppen 77 00:03:34,650 --> 00:03:35,500 der Server. 78 00:03:35,500 --> 00:03:39,470 >> Darunter ist das, was scheint, eine sein Endlosschleife, von denen die erste Leitung 79 00:03:39,470 --> 00:03:41,660 effektiv ist ein Aufruf auf eine Funktion 80 00:03:41,660 --> 00:03:45,110 zurückzusetzen, die uns we Umsetzung später um 81 00:03:45,110 --> 00:03:47,470 frei zu einigen unserer globalen Zustände. 82 00:03:47,470 --> 00:03:50,480 Danach ist eine Linie von Code, bedingt 83 00:03:50,480 --> 00:03:52,576 überprüft die Rück Wert verbunden. 84 00:03:52,576 --> 00:03:55,700 Jetzt verbunden sieht aus wie ein Prädikat, etwas, das wahr oder falsch zurückgibt. 85 00:03:55,700 --> 00:03:58,040 Und das tut es, aber es gibt etwas Besonderes in angeschlossenen 86 00:03:58,040 --> 00:03:59,960 in, dass es ein blockierender Aufruf. 87 00:03:59,960 --> 00:04:03,180 Es wird dort zu sitzen und zu warten bis zum Browser des Benutzers 88 00:04:03,180 --> 00:04:05,860 versucht, auf diese Web verbinden Server und nur dann wird es 89 00:04:05,860 --> 00:04:10,160 Rückkehr wahr oder falsch, so dass wir fortfahren an der Innenseite des if-Anweisung. 90 00:04:10,160 --> 00:04:13,870 >> Dort angekommen, bemerken diese Funktion, um eine Funktion aufgerufen Parse, die wir geschrieben haben, 91 00:04:13,870 --> 00:04:17,230 die alle der Bytes analysiert, alle der Bytes, die von einem Browser, 92 00:04:17,230 --> 00:04:21,010 an den Server, so dass wir geben kann Sie wieder am Ende ein Wert, der eine 93 00:04:21,010 --> 00:04:24,420 dieser globalen Variablen, speichert alle der Bytes in nur 94 00:04:24,420 --> 00:04:26,630 die Header daß Anforderung nicht der Körper 95 00:04:26,630 --> 00:04:28,920 wenn es eigentlich ein Körper, um es. 96 00:04:28,920 --> 00:04:32,980 >> Jetzt unten wir beginnen, analysieren diese Header zu extrahieren 97 00:04:32,980 --> 00:04:35,490 eine Teilmenge der Informationen wir kümmern uns um. 98 00:04:35,490 --> 00:04:37,740 Genauer gesagt, die pro Spezifikation wir zunächst 99 00:04:37,740 --> 00:04:40,580 wollte Leitung verlangen, das ist, nur, dass erste Zeile, 100 00:04:40,580 --> 00:04:45,710 hoffentlich etwas sagt wie get Schrägstrich oder einen Weg und dann HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Wir nutzen diese Metapher einer Nadel im Heuhaufen 102 00:04:48,150 --> 00:04:50,370 nach bestimmten aussehen Zeichen oder Adressen. 103 00:04:50,370 --> 00:04:53,120 Und in der Tat, es gibt eine Reihe von Funktionen in unserem Vertriebs Code 104 00:04:53,120 --> 00:04:56,930 dass auch Sie hilfreich finden könnte, bei der Suche nach bestimmten Werten. 105 00:04:56,930 --> 00:05:00,630 >> Letztlich diese Bytes kopieren wir in eine Variable namens Linie, 106 00:05:00,630 --> 00:05:03,510 welche feststellen, zu, haben wir auf dem Stapel zuge 107 00:05:03,510 --> 00:05:05,890 mittels eines dynamisch dimensioniert Array. 108 00:05:05,890 --> 00:05:08,350 Und wir bewusst versucht um zu vermeiden, ruft malloc 109 00:05:08,350 --> 00:05:11,100 weil wieder, denn Kontroll C wobei 110 00:05:11,100 --> 00:05:14,630 eine potentielle Merkmal dieses Programms, die wir will nicht diesen Code plötzlich 111 00:05:14,630 --> 00:05:17,479 durch den Benutzer unterbrochen schlag Kontrolle C, wobei das Ergebnis davon 112 00:05:17,479 --> 00:05:20,270 ist, dass ich vielleicht eine Chance nicht kostenlos etwas, das ich malloced. 113 00:05:20,270 --> 00:05:23,660 So versuche ich, so viel verwenden des Stapels kann ich hier. 114 00:05:23,660 --> 00:05:26,040 >> Weiter oben, eine ganze Reihe von auf dos. 115 00:05:26,040 --> 00:05:28,930 Die Spezifikation wird darlegen auf genau das, was Sie hier erwartet, 116 00:05:28,930 --> 00:05:31,800 aber die Kommentare geben Ihnen ein Hauch von dem, was vor uns liegt. 117 00:05:31,800 --> 00:05:33,830 Als erstes müssen Sie Validierung der Anforderungsleitung 118 00:05:33,830 --> 00:05:37,760 und stellen Sie sicher, dass es aussieht wie die Spezifikationen Grammatik, so zu sprechen, 119 00:05:37,760 --> 00:05:38,541 sagt es sollte. 120 00:05:38,541 --> 00:05:41,290 Sie müssen dann etwas zu extrahieren rief die Abfrage, die Sachen aus 121 00:05:41,290 --> 00:05:44,200 nach einem Fragezeichen, wie wir mit unserer Google Beispiel sah 122 00:05:44,200 --> 00:05:46,320 im Vorbeigehen in einem HD-Parameter. 123 00:05:46,320 --> 00:05:49,050 Wir verketten dann die Wurzel des Webservers 124 00:05:49,050 --> 00:05:52,520 mit dem Pfad, der in ist dieser Antrag ersten Zeile 125 00:05:52,520 --> 00:05:56,010 und bilden den vollständigen Pfad die Datei wollen wir zu achten ist. 126 00:05:56,010 --> 00:06:00,300 >> Danach werden wir, um sicherzustellen, , dass die Datei existiert und lesbar ist. 127 00:06:00,300 --> 00:06:05,100 Und dann werden wir zu extrahieren ihre Dateierweiterung, die .html oder .php, 128 00:06:05,100 --> 00:06:09,920 oder so-Erweiterung, die auf die ist Ganz am Ende der angeforderten Zeichenfolge. 129 00:06:09,920 --> 00:06:11,940 Als nächstes ist eine ganze Reihe von Code schrieben wir 130 00:06:11,940 --> 00:06:15,800 tatsächlich PHP generieren generated Content für Sie. 131 00:06:15,800 --> 00:06:18,010 Kurz gesagt, diese Code nimmt im Namen 132 00:06:18,010 --> 00:06:20,250 der Datei, die Sie PHP zu interpretieren. 133 00:06:20,250 --> 00:06:24,630 Wir fahren durch die so genannte ein Rohr in der PHP-Interpreter. 134 00:06:24,630 --> 00:06:28,060 Holen Sie sich zurück, als ob die Antwort die Antwort waren eine Datei selbst. 135 00:06:28,060 --> 00:06:32,110 Und dann über die Datei zu durchlaufen wir Bytes, zog sie alle in einen Puffer 136 00:06:32,110 --> 00:06:34,180 so dass wir letztlich ausdrucken. 137 00:06:34,180 --> 00:06:37,230 >> Tatsächlich sind alle diese ruft hier, um dprintf 138 00:06:37,230 --> 00:06:40,110 ermöglicht es uns, etwas zu drucken genannt Dateideskriptor, die 139 00:06:40,110 --> 00:06:42,350 ist nur eine ganze Zahl dass eine Datei. 140 00:06:42,350 --> 00:06:45,360 Sehr ähnlich in Geist, sondern grundlegend von einer Datei 141 00:06:45,360 --> 00:06:46,620 Sterne-Zeiger. 142 00:06:46,620 --> 00:06:50,260 Beachten Sie, wie Sie können, wie Syntax verwenden printf hier, so dass ich dynamisch 143 00:06:50,260 --> 00:06:54,000 legen etwas wie die Länge für den Wert von einem HTTP-Header 144 00:06:54,000 --> 00:06:55,270 genannte Content-Length. 145 00:06:55,270 --> 00:06:57,990 Und schließlich habe ich die Funktion vor, eigentlich schreiben 146 00:06:57,990 --> 00:07:00,040 der Körper auf die Anforderung. 147 00:07:00,040 --> 00:07:03,750 >> Leider haben wir nur durchgeführt Unterstützung für dynamisch 148 00:07:03,750 --> 00:07:05,350 generierten PHP-Dateien. 149 00:07:05,350 --> 00:07:08,520 Wir haben nicht umsetzen Unterstützung statische Dateien wie GIF, JPEG, 150 00:07:08,520 --> 00:07:10,660 und CSS und HTML-Dateien. 151 00:07:10,660 --> 00:07:14,450 Das ist leider bleibt Ihnen überlassen an den Client Zweck reagieren 152 00:07:14,450 --> 00:07:15,090 dies zu tun. 153 00:07:15,090 --> 00:07:20,050 Also dort werden Sie feststellen, dass es nicht viel Inspiration innerhalb dieses Blocks, 154 00:07:20,050 --> 00:07:23,520 aber wenn man ein wenig weiter oben, wie wir zur Interpretation PHP-Code ging, 155 00:07:23,520 --> 00:07:25,520 Funktionen, die Sie verwenden werden sind ein wenig anders. 156 00:07:25,520 --> 00:07:27,561 >> In der Tat, können Sie ausleihen einige der Funktionen 157 00:07:27,561 --> 00:07:29,620 vielleicht aus der Forensik Problem Set, weil 158 00:07:29,620 --> 00:07:32,860 am Ende des Tages alles, was Sie brauchen hier tun ist, wenn Sie wissen, welche Datei geöffnet 159 00:07:32,860 --> 00:07:35,690 und wenn Sie wissen, dass es so genannte MIME-Typ oder einem Inhaltstyp, 160 00:07:35,690 --> 00:07:39,040 Sie in diesen Bytes lesen müssen und irgendwie speit sie wieder aus. 161 00:07:39,040 --> 00:07:41,190 >> Und nun eine Tour durch diese andere Funktionen Datei. 162 00:07:41,190 --> 00:07:43,820 Bis ersten verbunden ist, die einfach true zurück 163 00:07:43,820 --> 00:07:47,350 wenn es endlich hört ein Verbindung von einem Benutzer. 164 00:07:47,350 --> 00:07:48,786 Als nächstes ist Fehler. 165 00:07:48,786 --> 00:07:52,296 Fehlerdessen als eine Funktion wir schrieb an alle anderen 400 hand 166 00:07:52,296 --> 00:07:55,360 und 500 HTTP-Status Codes, die Sie vielleicht 167 00:07:55,360 --> 00:07:58,500 an den Benutzer zurückzusenden, zusammen mit einer Standard-Nachricht. 168 00:07:58,500 --> 00:08:01,950 >> Als nächstes ist Last, ein besonders fleischig Funktion, deren Zweck im Leben 169 00:08:01,950 --> 00:08:06,920 wird aus einer Datei Sterne Lesezeiger der Inhalt einer Datei in einen globalen Puffer 170 00:08:06,920 --> 00:08:09,000 dass wir global deklariert oben [? Haupt. ?] 171 00:08:09,000 --> 00:08:12,649 Das ist ein bisschen kompliziert, weil wir müssen die Bytes aus der Datei gelesen 172 00:08:12,649 --> 00:08:14,690 aber überprüfen Sie bei jeder Iteration ob wir bereits haben 173 00:08:14,690 --> 00:08:17,600 traf das Ende der Datei oder etwas schief gegangen ist. 174 00:08:17,600 --> 00:08:21,210 Und wir verwenden realloc um sicherzustellen, dass was auch immer Puffer verwenden wir wächst 175 00:08:21,210 --> 00:08:24,440 und wächst und wächst und immer bleiben voran von der Anzahl von Bytes 176 00:08:24,440 --> 00:08:25,675 dass wir dort passen. 177 00:08:25,675 --> 00:08:27,550 Handler, mittlerweile ist die Funktion, die bekommt 178 00:08:27,550 --> 00:08:30,630 haft mit genannt Registrierte Steuerung C als Signal 179 00:08:30,630 --> 00:08:32,140 dass wir wollen, abzufangen. 180 00:08:32,140 --> 00:08:34,070 Beachten Sie, hier in Handler dass es letztendlich 181 00:08:34,070 --> 00:08:36,780 Anrufe zu beenden, was natürlich stoppt den Web-Server. 182 00:08:36,780 --> 00:08:39,750 Und leider Lookup ist nicht implementiert. 183 00:08:39,750 --> 00:08:41,940 Im Geist, das ist ein ziemlich einfache Funktion. 184 00:08:41,940 --> 00:08:44,900 Bei einer Dateierweiterung, muss es Rückkehr ist es so genannte MIME 185 00:08:44,900 --> 00:08:46,320 Typ oder einem Inhaltstyp. 186 00:08:46,320 --> 00:08:49,260 Und wir in der Spezifikation angeben was das Mapping muss. 187 00:08:49,260 --> 00:08:52,330 Aber Sie übersetzen müssen es schließlich zu C-Code. 188 00:08:52,330 --> 00:08:56,490 >> Als nächstes ist unser ähnlich fleischig Funktion genannt Parse, deren Zweck im Leben 189 00:08:56,490 --> 00:08:59,350 zu lesen ist, nicht in einer Datei, sondern aus einer Netzwerkverbindung. 190 00:08:59,350 --> 00:09:03,510 Genauer gesagt, Lesen und Parsen der HTTP-Anforderung, ist von einem Browser kommen 191 00:09:03,510 --> 00:09:05,940 an den Server, so dass letztlich wir analysieren können 192 00:09:05,940 --> 00:09:09,530 bei nur die Header in der Anfrage Linie und zurück die zu Ihnen 193 00:09:09,530 --> 00:09:12,720 mittels eines globalen Puffer dass wir oben [erklärt? Haupt. ?] 194 00:09:12,720 --> 00:09:14,880 >> Zurücksetzen der Zwischenzeit wird ein Funktion, die wir definieren 195 00:09:14,880 --> 00:09:18,730 dass wird iterativ innerhalb genannt Haupt jedes Mal Sie sind 196 00:09:18,730 --> 00:09:20,799 bereit zu starten hören für eine neue Verbindung 197 00:09:20,799 --> 00:09:22,840 so dass wir immer wissen, der Zustand unserer Variablen 198 00:09:22,840 --> 00:09:24,870 und damit haben wir auch befreit jeden Speicher, 199 00:09:24,870 --> 00:09:28,070 könnte für zugeteilt worden eine vorherige Netzwerkverbindung. 200 00:09:28,070 --> 00:09:30,060 Als nächstes ist zu beginnen, die Funktion, die wir geschrieben haben 201 00:09:30,060 --> 00:09:31,920 dass eine ganze enthält Viele Netzwerk-Code 202 00:09:31,920 --> 00:09:34,420 das beginnt letztendlich auf den Webserver. 203 00:09:34,420 --> 00:09:36,680 >> Letzte up ist die Funktion genannt Altestelle, die 204 00:09:36,680 --> 00:09:38,770 tut genau das, es stoppt den Web-Server. 205 00:09:38,770 --> 00:09:42,270 Aber zuerst es entlastet jede Speicher dass noch zugeordnet worden. 206 00:09:42,270 --> 00:09:45,850 Aber es letztendlich ruft exit ohne auch nur die Steuerung zurück 207 00:09:45,850 --> 00:09:47,480 unsere Hauptaufgabe. 208 00:09:47,480 --> 00:09:49,480 Letztlich eine der wichtigsten Techniken 209 00:09:49,480 --> 00:09:52,680 Bei der Umsetzung dieser Web-Server werde ein bisschen von Versuch und Irrtum sein, 210 00:09:52,680 --> 00:09:55,886 mit einem Browser-Fenster geöffnet auf der rechten Seite und ein Terminal-Fenster an 211 00:09:55,886 --> 00:09:57,760 links, die Server-Konsole Fenster, so dass Sie 212 00:09:57,760 --> 00:10:00,420 können die Nachrichten, die es zu sehen die auf dem Bildschirm angezeigt. 213 00:10:00,420 --> 00:10:04,170 >> Aber noch besser wäre ein Drittel Fenster, ein zweites Terminalfenster 214 00:10:04,170 --> 00:10:07,135 in dem Sie Telnet, die Nutzung für die in der Spezifikation vorgeschrieben. 215 00:10:07,135 --> 00:10:09,640 Und Telnet ist nur eine sehr einfache Netzwerkprogramm 216 00:10:09,640 --> 00:10:12,660 , mit dem Sie auf so zu tun, ist ein Browser in einem Fenster 217 00:10:12,660 --> 00:10:14,540 während er mit der anderen Fenster. 218 00:10:14,540 --> 00:10:16,830 Auf diese Weise können Sie sehen, genau die Textbefehle 219 00:10:16,830 --> 00:10:18,700 die zurück kommen vom Server zum Client 220 00:10:18,700 --> 00:10:20,810 ohne Stossen um Chrome-Entwickler 221 00:10:20,810 --> 00:10:24,010 Werkzeuge in einem ansonsten clunkier Schnittstelle. 222 00:10:24,010 --> 00:10:29,099