1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 SPEAKER: Sekarang mari kita menyelam ke dalam kode distribusi 3 00:00:11,730 --> 00:00:14,470 dan lihatlah konteks di mana kode Anda menulis 4 00:00:14,470 --> 00:00:15,780 akan beroperasi. 5 00:00:15,780 --> 00:00:17,350 Pada akhir hari, Anda akan menerapkan 6 00:00:17,350 --> 00:00:18,710 keseluruhan dari web server. 7 00:00:18,710 --> 00:00:20,460 Tapi kami telah menyediakan Anda dengan kerangka 8 00:00:20,460 --> 00:00:24,090 kode yang memiliki beberapa fungsi, khususnya yang berkaitan dengan jaringan. 9 00:00:24,090 --> 00:00:25,390 Mari kita lihat. 10 00:00:25,390 --> 00:00:27,560 >> Jadi di sini menuju puncak file adalah a bunch 11 00:00:27,560 --> 00:00:30,020 fitur menguji persyaratan makro. 12 00:00:30,020 --> 00:00:33,570 Sekarang ini hanya fitur c, dimana menurut sekelompok halaman manual 13 00:00:33,570 --> 00:00:36,410 Anda harus mendefinisikan beberapa konstanta ini untuk menjadi kenyataan 14 00:00:36,410 --> 00:00:39,920 atau bahkan nomor tertentu sehingga Anda memiliki akses ke fungsi-fungsi tertentu. 15 00:00:39,920 --> 00:00:42,470 Jika tidak, mereka akan dideklarasikan dan Anda tidak akan memiliki akses. 16 00:00:42,470 --> 00:00:45,340 Jadi saya sudah melakukan ini dengan cara membaca halaman manual. 17 00:00:45,340 --> 00:00:48,410 Sekarang di bawah, di baris 15 sampai 17, kita 18 00:00:48,410 --> 00:00:50,550 memiliki sejumlah besar batas diumumkan. 19 00:00:50,550 --> 00:00:53,370 >> Dan kami telah meminjam ini dari Server web populer disebut Apache. 20 00:00:53,370 --> 00:00:54,650 Dan ini hanya nomor yang akan 21 00:00:54,650 --> 00:00:56,810 untuk topi jumlah byte yang diizinkan 22 00:00:56,810 --> 00:01:01,930 dalam berbagai konteks untuk permintaan HTTP bahwa browser diperbolehkan untuk mengirim saya. 23 00:01:01,930 --> 00:01:04,310 Selanjutnya, kita mendefinisikan oktet. 24 00:01:04,310 --> 00:01:07,790 Sekarang oktet adalah cara mewah mengatakan byte, atau delapan bit. 25 00:01:07,790 --> 00:01:10,720 Ternyata di masa lampau byte belum tentu delapan bit, 26 00:01:10,720 --> 00:01:12,339 sehingga oktet selalu delapan bit. 27 00:01:12,339 --> 00:01:14,880 Jadi dalam hal ini kita telah mengadopsi apa yang umum di jaringan tersebut 28 00:01:14,880 --> 00:01:17,410 dunia memanggil delapan byte oktet. 29 00:01:17,410 --> 00:01:21,840 >> Di sini saya telah menetapkan bahwa oktet akan 512, sehingga banyak seperti di forensik 30 00:01:21,840 --> 00:01:24,170 ketika kita membaca banyak byte pada suatu waktu, di sini juga, 31 00:01:24,170 --> 00:01:27,390 kita akan membaca sekelompok oktet pada suatu waktu. 32 00:01:27,390 --> 00:01:28,922 Selanjutnya sejumlah besar file header. 33 00:01:28,922 --> 00:01:30,255 Bagaimana saya tahu untuk menyertakan? 34 00:01:30,255 --> 00:01:32,730 Yah aku hanya membaca pria halaman untuk sejumlah fungsi 35 00:01:32,730 --> 00:01:35,620 bahwa kita akan menggunakan distribusi ini kode dan termasuk dalam orang-orang 36 00:01:35,620 --> 00:01:37,390 Saya diperintahkan untuk. 37 00:01:37,390 --> 00:01:39,090 >> Dan sekarang kita memiliki tipe data. 38 00:01:39,090 --> 00:01:41,470 Kami telah menyatakan oktet menjadi char. 39 00:01:41,470 --> 00:01:44,040 Dan kita akan lihat nanti bahwa itu digunakan di seluruh kode. 40 00:01:44,040 --> 00:01:45,670 Dan kami telah dinyatakan sebagai Seluruh sekelompok prototipe, 41 00:01:45,670 --> 00:01:47,961 dan kami akan berjalan dengan cepat melalui masing-masing fungsi. 42 00:01:47,961 --> 00:01:50,400 Terakhir, dan mungkin yang paling penting untuk tetap 43 00:01:50,400 --> 00:01:52,520 keberatan pada saat ini dalam cerita, adalah bahwa ada 44 00:01:52,520 --> 00:01:54,520 adalah, pada kenyataannya seluruh sekelompok variabel global 45 00:01:54,520 --> 00:02:00,430 di bagian atas file, akar, CFD, SFD, permintaan, berkas dan tubuh. 46 00:02:00,430 --> 00:02:03,960 >> Sekarang umumnya, menggunakan begitu banyak dunia variabel, atau variabel global sama sekali, 47 00:02:03,960 --> 00:02:05,280 bukan praktik kembali. 48 00:02:05,280 --> 00:02:09,090 Tapi ternyata kita juga menggunakan teknik yang disebut penanganan sinyal kemudian 49 00:02:09,090 --> 00:02:11,930 dalam kode, yang memungkinkan kita untuk mendeteksi ketika pengguna hits sesuatu 50 00:02:11,930 --> 00:02:15,080 seperti CTRL C dan menutup server anggun. 51 00:02:15,080 --> 00:02:18,240 Dan untuk melakukan itu anggun dan benar-benar membebaskan memori, 52 00:02:18,240 --> 00:02:20,800 kita perlu memiliki akses ke variabel-variabel global. 53 00:02:20,800 --> 00:02:24,510 >> Dan sekarang mari kita lihat utama, yang drive keseluruhan program ini. 54 00:02:24,510 --> 00:02:27,720 Pertama, di atas sini kita memiliki variabel nomor kesalahan 55 00:02:27,720 --> 00:02:29,570 yang muncul tidak memiliki tipe, tapi itu 56 00:02:29,570 --> 00:02:31,500 karena itu benar-benar didefinisikan dalam sebuah file bernama 57 00:02:31,500 --> 00:02:34,800 Kesalahan errno.h yang termasuk lebih tinggi. 58 00:02:34,800 --> 00:02:38,780 Jika Anda manusia errno untuk benar-benar melihat definisi untuk hal ini, 59 00:02:38,780 --> 00:02:41,230 Anda akan melihat bahwa ini adalah variabel global khusus yang 60 00:02:41,230 --> 00:02:43,350 diatur oleh seluruh bunch fungsi tidak tertulis 61 00:02:43,350 --> 00:02:48,730 oleh kami, tapi oleh penulis Linux dan sistem lain untuk benar-benar mengatur 62 00:02:48,730 --> 00:02:52,400 sejumlah itu variabel ketika sesuatu beres sehingga Anda dapat secara global 63 00:02:52,400 --> 00:02:54,830 mencari tahu apa yang lakukan salah. 64 00:02:54,830 --> 00:02:58,540 >> Sekarang di bawah Anda akan melihat baru Teknik mungkin menggunakan getopt, 65 00:02:58,540 --> 00:03:01,790 fungsi yang membantu perintah parse argumen baris sehingga kita tidak 66 00:03:01,790 --> 00:03:05,540 perlu repot membuang-buang waktu mencari cara untuk mengurai sesuatu seperti 8080, 67 00:03:05,540 --> 00:03:08,350 atau dasbor p, atau dasbor h untuk mendapatkan bantuan. 68 00:03:08,350 --> 00:03:10,300 getopt dasarnya melakukan itu untuk kita. 69 00:03:10,300 --> 00:03:11,750 Lihat halaman manual untuk lebih. 70 00:03:11,750 --> 00:03:13,960 >> Selanjutnya, kita melakukan sedikit kesalahan memeriksa untuk memastikan 71 00:03:13,960 --> 00:03:17,420 bahwa nomor port adalah dalam kisaran tertentu dalam spesifikasi. 72 00:03:17,420 --> 00:03:20,240 Selanjutnya, kita lihat panggilan ke fungsi mulai, yang definisinya kita akan 73 00:03:20,240 --> 00:03:24,040 melihat dalam beberapa saat, dan seperti namanya menunjukkan, ini mulai server web. 74 00:03:24,040 --> 00:03:26,960 Di sini kita memiliki panggilan untuk fungsi disebut sinyal yang mengatakan, 75 00:03:26,960 --> 00:03:30,750 jika dan ketika Anda mendengar Kontrol C dari keyboard pengguna, pergi ke depan dan panggilan 76 00:03:30,750 --> 00:03:34,650 fungsi yang disebut handler yang akan hal yang akhirnya membersihkan dan berhenti 77 00:03:34,650 --> 00:03:35,500 server. 78 00:03:35,500 --> 00:03:39,470 >> Di bawah itu adalah apa yang tampaknya menjadi loop tak terbatas, baris pertama yang 79 00:03:39,470 --> 00:03:41,660 efektif adalah panggilan untuk fungsi yang disebut 80 00:03:41,660 --> 00:03:45,110 ulang, yang kita sendiri mengimplementasikan nanti dalam rangka 81 00:03:45,110 --> 00:03:47,470 untuk membebaskan beberapa negara global kami. 82 00:03:47,470 --> 00:03:50,480 Setelah itu adalah garis kode yang kondisional 83 00:03:50,480 --> 00:03:52,576 adalah memeriksa pengembalian nilai terhubung. 84 00:03:52,576 --> 00:03:55,700 Terlihat sekarang terhubung seperti predikat, sesuatu yang mengembalikan benar atau salah. 85 00:03:55,700 --> 00:03:58,040 Dan itu, tapi ada sesuatu yang istimewa di terhubung 86 00:03:58,040 --> 00:03:59,960 dalam hal ini adalah pemblokiran panggilan. 87 00:03:59,960 --> 00:04:03,180 Ini akan duduk di sana dan menunggu sampai browser pengguna 88 00:04:03,180 --> 00:04:05,860 mencoba terhubung ke web ini server dan hanya kemudian akan hal itu 89 00:04:05,860 --> 00:04:10,160 kembali benar atau salah sehingga kita lanjutkan ke bagian dalam ini jika pernyataan. 90 00:04:10,160 --> 00:04:13,870 >> Sesampai di sana, perhatikan fungsi ini ke fungsi yang disebut parsing, yang kita tulis, 91 00:04:13,870 --> 00:04:17,230 yang mem-parsing semua oktet, semua byte yang berasal dari browser 92 00:04:17,230 --> 00:04:21,010 ke server, sehingga kita dapat tangan Anda kembali pada akhirnya nilai satu 93 00:04:21,010 --> 00:04:24,420 dari variabel global yang menyimpan semua byte hanya 94 00:04:24,420 --> 00:04:26,630 header yang permintaan, bukan tubuh 95 00:04:26,630 --> 00:04:28,920 jika ada sebenarnya tubuh untuk itu. 96 00:04:28,920 --> 00:04:32,980 >> Sekarang di bawah kita mulai mengurai mereka header untuk mengekstrak 97 00:04:32,980 --> 00:04:35,490 subset dari informasi bahwa kita peduli. 98 00:04:35,490 --> 00:04:37,740 Secara khusus, sesuai dengan spesifikasi, pertama-tama kita 99 00:04:37,740 --> 00:04:40,580 ingin meminta line, yang hanya garis pertama yang 100 00:04:40,580 --> 00:04:45,710 mudah-mudahan mengatakan sesuatu seperti get memangkas atau beberapa jalur dan kemudian HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Kami menggunakan metafora ini jarum di tumpukan jerami 102 00:04:48,150 --> 00:04:50,370 untuk mencari khusus karakter atau alamat. 103 00:04:50,370 --> 00:04:53,120 Dan memang, ada sejumlah fungsi dalam kode distribusi kami 104 00:04:53,120 --> 00:04:56,930 Anda juga mungkin menemukan membantu ketika mencari nilai-nilai tertentu. 105 00:04:56,930 --> 00:05:00,630 >> Pada akhirnya, kita copy byte ini menjadi variabel yang disebut line, 106 00:05:00,630 --> 00:05:03,510 yang melihat, juga, kami telah dialokasikan pada stack 107 00:05:03,510 --> 00:05:05,890 dengan cara array berukuran dinamis. 108 00:05:05,890 --> 00:05:08,350 Dan kami sengaja mencoba untuk menghindari memanggil malloc 109 00:05:08,350 --> 00:05:11,100 karena sekali lagi, karena Pengendalian C yang 110 00:05:11,100 --> 00:05:14,630 fitur potensi program ini, kami tidak ingin memiliki kode ini tiba-tiba 111 00:05:14,630 --> 00:05:17,479 terganggu oleh memukul pengguna Kontrol C, hasil yang 112 00:05:17,479 --> 00:05:20,270 adalah bahwa saya mungkin tidak memiliki kesempatan untuk sesuatu yang gratis saya sudah malloced. 113 00:05:20,270 --> 00:05:23,660 Jadi aku mencoba untuk menggunakan sebanyak tumpukan adalah saya dapat di sini. 114 00:05:23,660 --> 00:05:26,040 >> Berikutnya, sejumlah besar ke dos. 115 00:05:26,040 --> 00:05:28,930 Spesifikasi akan menjelaskan pada apa yang diharapkan di sini, 116 00:05:28,930 --> 00:05:31,800 tapi komentar memberikan sedikit apa yang ada di depan. 117 00:05:31,800 --> 00:05:33,830 Anda harus terlebih dahulu memvalidasi garis permintaan 118 00:05:33,830 --> 00:05:37,760 dan pastikan bahwa itu tampak seperti spesifikasi tata bahasa, sehingga untuk berbicara, 119 00:05:37,760 --> 00:05:38,541 mengatakan seharusnya. 120 00:05:38,541 --> 00:05:41,290 Anda kemudian perlu untuk mengambil sesuatu disebut query, hal-hal yang keluar 121 00:05:41,290 --> 00:05:44,200 setelah tanda tanya, seperti kita lihat dengan contoh Google kami 122 00:05:44,200 --> 00:05:46,320 secara sepintas dalam parameter HD. 123 00:05:46,320 --> 00:05:49,050 Kami kemudian menggabungkan bersama-sama akar server web 124 00:05:49,050 --> 00:05:52,520 dengan jalan yang ada di bahwa permintaan baris pertama 125 00:05:52,520 --> 00:05:56,010 dan membentuk path penuh file kita ingin mencari. 126 00:05:56,010 --> 00:06:00,300 >> Setelah itu, kita akan memastikan bahwa file tersebut ada dan dapat dibaca. 127 00:06:00,300 --> 00:06:05,100 Dan kemudian kita akan mengekstrak nya ekstensi file, html atau php tersebut, 128 00:06:05,100 --> 00:06:09,920 atau beberapa ekstensi seperti itu di akhir dari string yang diminta. 129 00:06:09,920 --> 00:06:11,940 Selanjutnya adalah keseluruhan sekelompok kode yang kami tulis 130 00:06:11,940 --> 00:06:15,800 untuk benar-benar menghasilkan PHP generated content untuk Anda. 131 00:06:15,800 --> 00:06:18,010 Singkatnya, ini Kode mengambil dalam nama 132 00:06:18,010 --> 00:06:20,250 file yang ingin PHP untuk menafsirkan. 133 00:06:20,250 --> 00:06:24,630 Kami lulus dengan sesuatu yang disebut pipa ke interpreter PHP. 134 00:06:24,630 --> 00:06:28,060 Mendapatkan kembali respon seakan respon adalah file itu sendiri. 135 00:06:28,060 --> 00:06:32,110 Dan kemudian kita beralih di atas bahwa file byte, menarik mereka semua menjadi satu penyangga 136 00:06:32,110 --> 00:06:34,180 sehingga kita bisa akhirnya mencetaknya. 137 00:06:34,180 --> 00:06:37,230 >> Memang, semua ini panggilan di sini untuk dprintf 138 00:06:37,230 --> 00:06:40,110 memungkinkan kita untuk mencetak sesuatu disebut file descriptor, yang 139 00:06:40,110 --> 00:06:42,350 hanya integer yang mewakili file. 140 00:06:42,350 --> 00:06:45,360 Sangat mirip dalam roh, tetapi fundamental berbeda dari file 141 00:06:45,360 --> 00:06:46,620 pointer bintang. 142 00:06:46,620 --> 00:06:50,260 Perhatikan bagaimana Anda dapat menggunakan sintaks seperti printf sini sehingga saya secara dinamis dapat 143 00:06:50,260 --> 00:06:54,000 masukkan sesuatu seperti panjang untuk nilai header HTTP 144 00:06:54,000 --> 00:06:55,270 disebut Content-Length. 145 00:06:55,270 --> 00:06:57,990 Dan akhirnya saya menggunakan fungsi yang tepat untuk benar-benar menulis 146 00:06:57,990 --> 00:07:00,040 tubuh untuk permintaan. 147 00:07:00,040 --> 00:07:03,750 >> Sayangnya, kita hanya dilaksanakan dukungan untuk dinamis 148 00:07:03,750 --> 00:07:05,350 dihasilkan file PHP. 149 00:07:05,350 --> 00:07:08,520 Kami tidak menerapkan dukungan untuk file statis seperti gifs, dan JPEG, 150 00:07:08,520 --> 00:07:10,660 dan CSS dan HTML file. 151 00:07:10,660 --> 00:07:14,450 Artinya, sayangnya, yang tersisa untuk Anda untuk menanggapi tujuan klien 152 00:07:14,450 --> 00:07:15,090 ini untuk melakukan. 153 00:07:15,090 --> 00:07:20,050 Jadi di sana Anda akan menemukan bahwa ada tidak banyak inspirasi dalam blok itu, 154 00:07:20,050 --> 00:07:23,520 tetapi jika Anda sedikit lebih tinggi pada bagaimana kami pergi tentang menafsirkan kode PHP, 155 00:07:23,520 --> 00:07:25,520 fungsi yang akan Anda gunakan yang sedikit berbeda. 156 00:07:25,520 --> 00:07:27,561 >> Bahkan, Anda dapat meminjam beberapa fungsi 157 00:07:27,561 --> 00:07:29,620 mungkin dari forensik Masalah set, karena 158 00:07:29,620 --> 00:07:32,860 pada akhir hari semua yang Anda butuhkan untuk lakukan di sini adalah setelah Anda tahu apa yang membuka file 159 00:07:32,860 --> 00:07:35,690 dan setelah Anda tahu yang disebut itu Tipe MIME atau jenis konten, 160 00:07:35,690 --> 00:07:39,040 Anda perlu membaca pada mereka byte dan entah bagaimana meludah mereka kembali. 161 00:07:39,040 --> 00:07:41,190 >> Dan sekarang tur ini fungsi file lainnya. 162 00:07:41,190 --> 00:07:43,820 Up pertama terhubung, yang hanya mengembalikan nilai true 163 00:07:43,820 --> 00:07:47,350 ketika akhirnya mendengar sambungan dari pengguna. 164 00:07:47,350 --> 00:07:48,786 Selanjutnya adalah kesalahan. 165 00:07:48,786 --> 00:07:52,296 Kesalahan, sementara itu, sebagai fungsi yang kita menulis untuk menangani semua berbeda 400 166 00:07:52,296 --> 00:07:55,360 dan status 500 HTTP Kode yang Anda mungkin ingin 167 00:07:55,360 --> 00:07:58,500 untuk mengirim kembali ke pengguna, bersama dengan pesan standar. 168 00:07:58,500 --> 00:08:01,950 >> Selanjutnya adalah beban, yang terutama Fungsi gemuk, yang tujuannya dalam hidup 169 00:08:01,950 --> 00:08:06,920 adalah untuk membaca dari bintang berkas pointer yang isi file ke dalam buffer dunia 170 00:08:06,920 --> 00:08:09,000 bahwa kita menyatakan secara global di atas [? utama. ?] 171 00:08:09,000 --> 00:08:12,649 Ini adalah sedikit rumit karena kita harus membaca byte dari file 172 00:08:12,649 --> 00:08:14,690 tetapi memeriksa setiap iterasi apakah kita sudah sudah 173 00:08:14,690 --> 00:08:17,600 memukul akhir file atau sesuatu yang lain yang tidak beres. 174 00:08:17,600 --> 00:08:21,210 Dan kita menggunakan realloc memastikan bahwa penyangga kita menggunakan apa pun yang tumbuh 175 00:08:21,210 --> 00:08:24,440 dan tumbuh dan berkembang dan selalu tinggal di depan jumlah byte 176 00:08:24,440 --> 00:08:25,675 bahwa kita harus cocok di sana. 177 00:08:25,675 --> 00:08:27,550 Handler, sementara itu, adalah fungsi yang mendapat 178 00:08:27,550 --> 00:08:30,630 disebut dengan cara memiliki terdaftar Kontrol C sebagai sinyal 179 00:08:30,630 --> 00:08:32,140 bahwa kita ingin mencegat. 180 00:08:32,140 --> 00:08:34,070 Perhatikan di sini di handler yang pada akhirnya 181 00:08:34,070 --> 00:08:36,780 panggilan berhenti, yang tentu saja berhenti server web. 182 00:08:36,780 --> 00:08:39,750 Dan sayangnya, lookup tidak dilaksanakan. 183 00:08:39,750 --> 00:08:41,940 Dalam semangat, ini adalah Fungsi cukup sederhana. 184 00:08:41,940 --> 00:08:44,900 Mengingat ekstensi file, perlu untuk kembali itu disebut MIME 185 00:08:44,900 --> 00:08:46,320 jenis atau tipe konten. 186 00:08:46,320 --> 00:08:49,260 Dan kita tentukan dalam spesifikasi apa pemetaan yang harus. 187 00:08:49,260 --> 00:08:52,330 Tapi Anda perlu untuk menerjemahkan akhirnya kode c. 188 00:08:52,330 --> 00:08:56,490 >> Selanjutnya adalah fungsi sama gemuk kami disebut parsing, tujuan yang dalam hidup 189 00:08:56,490 --> 00:08:59,350 adalah membaca, bukan dari file, tapi dari koneksi jaringan. 190 00:08:59,350 --> 00:09:03,510 Secara khusus, membaca dan parsing Permintaan HTTP yang berasal dari browser 191 00:09:03,510 --> 00:09:05,940 ke server sehingga akhirnya kita bisa mengurai 192 00:09:05,940 --> 00:09:09,530 di hanya header dalam permintaan line dan mengembalikan mereka kepada Anda 193 00:09:09,530 --> 00:09:12,720 dengan cara buffer global yang kami dinyatakan di atas [? utama. ?] 194 00:09:12,720 --> 00:09:14,880 >> Ulang, sementara itu, adalah fungsi yang kita mendefinisikan 195 00:09:14,880 --> 00:09:18,730 yang dipanggil iteratif dalam dari utama setiap kali Anda tentang 196 00:09:18,730 --> 00:09:20,799 siap untuk mulai mendengarkan untuk koneksi baru 197 00:09:20,799 --> 00:09:22,840 sehingga kita selalu tahu keadaan variabel kami 198 00:09:22,840 --> 00:09:24,870 dan agar kita sudah juga dibebaskan memori setiap yang 199 00:09:24,870 --> 00:09:28,070 mungkin telah dialokasikan untuk koneksi jaringan sebelumnya. 200 00:09:28,070 --> 00:09:30,060 Berikutnya yaitu memulai, fungsi yang kita tulis 201 00:09:30,060 --> 00:09:31,920 yang berisi keseluruhan banyak kode jaringan 202 00:09:31,920 --> 00:09:34,420 yang pada akhirnya mulai server web. 203 00:09:34,420 --> 00:09:36,680 >> Up terakhir adalah fungsi disebut berhenti, yang 204 00:09:36,680 --> 00:09:38,770 tidak tepat, hal itu berhenti server web. 205 00:09:38,770 --> 00:09:42,270 Tapi pertama-tama membebaskan memori apapun yang masih telah dialokasikan. 206 00:09:42,270 --> 00:09:45,850 Tapi akhirnya panggilan keluar tanpa kembali kendali 207 00:09:45,850 --> 00:09:47,480 fungsi utama kami. 208 00:09:47,480 --> 00:09:49,480 Pada akhirnya, salah satu kebanyakan teknik penting 209 00:09:49,480 --> 00:09:52,680 ketika mengimplementasikan web server ini adalah akan menjadi sedikit trial and error, 210 00:09:52,680 --> 00:09:55,886 memiliki satu browser jendela yang terbuka di sebelah kanan dan jendela terminal di 211 00:09:55,886 --> 00:09:57,760 kiri, server konsol jendela, sehingga Anda 212 00:09:57,760 --> 00:10:00,420 dapat melihat pesan yang yang ditampilkan di layar. 213 00:10:00,420 --> 00:10:04,170 >> Tapi lebih baik masih akan ketiga jendela, jendela terminal kedua, 214 00:10:04,170 --> 00:10:07,135 di mana Anda menggunakan Telnet, penggunaannya untuk yang ditentukan dalam spesifikasi. 215 00:10:07,135 --> 00:10:09,640 Dan Telnet hanya sangat program jaringan sederhana 216 00:10:09,640 --> 00:10:12,660 yang memungkinkan Anda untuk berpura-pura menjadi browser dalam satu jendela 217 00:10:12,660 --> 00:10:14,540 ketika berbicara dengan jendela lain. 218 00:10:14,540 --> 00:10:16,830 Dengan cara ini Anda dapat melihat persis perintah tekstual 219 00:10:16,830 --> 00:10:18,700 yang kembali dari server ke klien 220 00:10:18,700 --> 00:10:20,810 tanpa harus menusuk sekitar pengembang krom itu 221 00:10:20,810 --> 00:10:24,010 alat di sebaliknya antarmuka clunkier. 222 00:10:24,010 --> 00:10:29,099