SPEAKER: Sekarang mari kita menyelam ke dalam kode distribusi dan lihatlah konteks di mana kode Anda menulis akan beroperasi. Pada akhir hari, Anda akan menerapkan keseluruhan dari web server. Tapi kami telah menyediakan Anda dengan kerangka kode yang memiliki beberapa fungsi, khususnya yang berkaitan dengan jaringan. Mari kita lihat. Jadi di sini menuju puncak file adalah a bunch fitur menguji persyaratan makro. Sekarang ini hanya fitur c, dimana menurut sekelompok halaman manual Anda harus mendefinisikan beberapa konstanta ini untuk menjadi kenyataan atau bahkan nomor tertentu sehingga Anda memiliki akses ke fungsi-fungsi tertentu. Jika tidak, mereka akan dideklarasikan dan Anda tidak akan memiliki akses. Jadi saya sudah melakukan ini dengan cara membaca halaman manual. Sekarang di bawah, di baris 15 sampai 17, kita memiliki sejumlah besar batas diumumkan. Dan kami telah meminjam ini dari Server web populer disebut Apache. Dan ini hanya nomor yang akan untuk topi jumlah byte yang diizinkan dalam berbagai konteks untuk permintaan HTTP bahwa browser diperbolehkan untuk mengirim saya. Selanjutnya, kita mendefinisikan oktet. Sekarang oktet adalah cara mewah mengatakan byte, atau delapan bit. Ternyata di masa lampau byte belum tentu delapan bit, sehingga oktet selalu delapan bit. Jadi dalam hal ini kita telah mengadopsi apa yang umum di jaringan tersebut dunia memanggil delapan byte oktet. Di sini saya telah menetapkan bahwa oktet akan 512, sehingga banyak seperti di forensik ketika kita membaca banyak byte pada suatu waktu, di sini juga, kita akan membaca sekelompok oktet pada suatu waktu. Selanjutnya sejumlah besar file header. Bagaimana saya tahu untuk menyertakan? Yah aku hanya membaca pria halaman untuk sejumlah fungsi bahwa kita akan menggunakan distribusi ini kode dan termasuk dalam orang-orang Saya diperintahkan untuk. Dan sekarang kita memiliki tipe data. Kami telah menyatakan oktet menjadi char. Dan kita akan lihat nanti bahwa itu digunakan di seluruh kode. Dan kami telah dinyatakan sebagai Seluruh sekelompok prototipe, dan kami akan berjalan dengan cepat melalui masing-masing fungsi. Terakhir, dan mungkin yang paling penting untuk tetap keberatan pada saat ini dalam cerita, adalah bahwa ada adalah, pada kenyataannya seluruh sekelompok variabel global di bagian atas file, akar, CFD, SFD, permintaan, berkas dan tubuh. Sekarang umumnya, menggunakan begitu banyak dunia variabel, atau variabel global sama sekali, bukan praktik kembali. Tapi ternyata kita juga menggunakan teknik yang disebut penanganan sinyal kemudian dalam kode, yang memungkinkan kita untuk mendeteksi ketika pengguna hits sesuatu seperti CTRL C dan menutup server anggun. Dan untuk melakukan itu anggun dan benar-benar membebaskan memori, kita perlu memiliki akses ke variabel-variabel global. Dan sekarang mari kita lihat utama, yang drive keseluruhan program ini. Pertama, di atas sini kita memiliki variabel nomor kesalahan yang muncul tidak memiliki tipe, tapi itu karena itu benar-benar didefinisikan dalam sebuah file bernama Kesalahan errno.h yang termasuk lebih tinggi. Jika Anda manusia errno untuk benar-benar melihat definisi untuk hal ini, Anda akan melihat bahwa ini adalah variabel global khusus yang diatur oleh seluruh bunch fungsi tidak tertulis oleh kami, tapi oleh penulis Linux dan sistem lain untuk benar-benar mengatur sejumlah itu variabel ketika sesuatu beres sehingga Anda dapat secara global mencari tahu apa yang lakukan salah. Sekarang di bawah Anda akan melihat baru Teknik mungkin menggunakan getopt, fungsi yang membantu perintah parse argumen baris sehingga kita tidak perlu repot membuang-buang waktu mencari cara untuk mengurai sesuatu seperti 8080, atau dasbor p, atau dasbor h untuk mendapatkan bantuan. getopt dasarnya melakukan itu untuk kita. Lihat halaman manual untuk lebih. Selanjutnya, kita melakukan sedikit kesalahan memeriksa untuk memastikan bahwa nomor port adalah dalam kisaran tertentu dalam spesifikasi. Selanjutnya, kita lihat panggilan ke fungsi mulai, yang definisinya kita akan melihat dalam beberapa saat, dan seperti namanya menunjukkan, ini mulai server web. Di sini kita memiliki panggilan untuk fungsi disebut sinyal yang mengatakan, jika dan ketika Anda mendengar Kontrol C dari keyboard pengguna, pergi ke depan dan panggilan fungsi yang disebut handler yang akan hal yang akhirnya membersihkan dan berhenti server. Di bawah itu adalah apa yang tampaknya menjadi loop tak terbatas, baris pertama yang efektif adalah panggilan untuk fungsi yang disebut ulang, yang kita sendiri mengimplementasikan nanti dalam rangka untuk membebaskan beberapa negara global kami. Setelah itu adalah garis kode yang kondisional adalah memeriksa pengembalian nilai terhubung. Terlihat sekarang terhubung seperti predikat, sesuatu yang mengembalikan benar atau salah. Dan itu, tapi ada sesuatu yang istimewa di terhubung dalam hal ini adalah pemblokiran panggilan. Ini akan duduk di sana dan menunggu sampai browser pengguna mencoba terhubung ke web ini server dan hanya kemudian akan hal itu kembali benar atau salah sehingga kita lanjutkan ke bagian dalam ini jika pernyataan. Sesampai di sana, perhatikan fungsi ini ke fungsi yang disebut parsing, yang kita tulis, yang mem-parsing semua oktet, semua byte yang berasal dari browser ke server, sehingga kita dapat tangan Anda kembali pada akhirnya nilai satu dari variabel global yang menyimpan semua byte hanya header yang permintaan, bukan tubuh jika ada sebenarnya tubuh untuk itu. Sekarang di bawah kita mulai mengurai mereka header untuk mengekstrak subset dari informasi bahwa kita peduli. Secara khusus, sesuai dengan spesifikasi, pertama-tama kita ingin meminta line, yang hanya garis pertama yang mudah-mudahan mengatakan sesuatu seperti get memangkas atau beberapa jalur dan kemudian HTTP 1.1. Kami menggunakan metafora ini jarum di tumpukan jerami untuk mencari khusus karakter atau alamat. Dan memang, ada sejumlah fungsi dalam kode distribusi kami Anda juga mungkin menemukan membantu ketika mencari nilai-nilai tertentu. Pada akhirnya, kita copy byte ini menjadi variabel yang disebut line, yang melihat, juga, kami telah dialokasikan pada stack dengan cara array berukuran dinamis. Dan kami sengaja mencoba untuk menghindari memanggil malloc karena sekali lagi, karena Pengendalian C yang fitur potensi program ini, kami tidak ingin memiliki kode ini tiba-tiba terganggu oleh memukul pengguna Kontrol C, hasil yang adalah bahwa saya mungkin tidak memiliki kesempatan untuk sesuatu yang gratis saya sudah malloced. Jadi aku mencoba untuk menggunakan sebanyak tumpukan adalah saya dapat di sini. Berikutnya, sejumlah besar ke dos. Spesifikasi akan menjelaskan pada apa yang diharapkan di sini, tapi komentar memberikan sedikit apa yang ada di depan. Anda harus terlebih dahulu memvalidasi garis permintaan dan pastikan bahwa itu tampak seperti spesifikasi tata bahasa, sehingga untuk berbicara, mengatakan seharusnya. Anda kemudian perlu untuk mengambil sesuatu disebut query, hal-hal yang keluar setelah tanda tanya, seperti kita lihat dengan contoh Google kami secara sepintas dalam parameter HD. Kami kemudian menggabungkan bersama-sama akar server web dengan jalan yang ada di bahwa permintaan baris pertama dan membentuk path penuh file kita ingin mencari. Setelah itu, kita akan memastikan bahwa file tersebut ada dan dapat dibaca. Dan kemudian kita akan mengekstrak nya ekstensi file, html atau php tersebut, atau beberapa ekstensi seperti itu di akhir dari string yang diminta. Selanjutnya adalah keseluruhan sekelompok kode yang kami tulis untuk benar-benar menghasilkan PHP generated content untuk Anda. Singkatnya, ini Kode mengambil dalam nama file yang ingin PHP untuk menafsirkan. Kami lulus dengan sesuatu yang disebut pipa ke interpreter PHP. Mendapatkan kembali respon seakan respon adalah file itu sendiri. Dan kemudian kita beralih di atas bahwa file byte, menarik mereka semua menjadi satu penyangga sehingga kita bisa akhirnya mencetaknya. Memang, semua ini panggilan di sini untuk dprintf memungkinkan kita untuk mencetak sesuatu disebut file descriptor, yang hanya integer yang mewakili file. Sangat mirip dalam roh, tetapi fundamental berbeda dari file pointer bintang. Perhatikan bagaimana Anda dapat menggunakan sintaks seperti printf sini sehingga saya secara dinamis dapat masukkan sesuatu seperti panjang untuk nilai header HTTP disebut Content-Length. Dan akhirnya saya menggunakan fungsi yang tepat untuk benar-benar menulis tubuh untuk permintaan. Sayangnya, kita hanya dilaksanakan dukungan untuk dinamis dihasilkan file PHP. Kami tidak menerapkan dukungan untuk file statis seperti gifs, dan JPEG, dan CSS dan HTML file. Artinya, sayangnya, yang tersisa untuk Anda untuk menanggapi tujuan klien ini untuk melakukan. Jadi di sana Anda akan menemukan bahwa ada tidak banyak inspirasi dalam blok itu, tetapi jika Anda sedikit lebih tinggi pada bagaimana kami pergi tentang menafsirkan kode PHP, fungsi yang akan Anda gunakan yang sedikit berbeda. Bahkan, Anda dapat meminjam beberapa fungsi mungkin dari forensik Masalah set, karena pada akhir hari semua yang Anda butuhkan untuk lakukan di sini adalah setelah Anda tahu apa yang membuka file dan setelah Anda tahu yang disebut itu Tipe MIME atau jenis konten, Anda perlu membaca pada mereka byte dan entah bagaimana meludah mereka kembali. Dan sekarang tur ini fungsi file lainnya. Up pertama terhubung, yang hanya mengembalikan nilai true ketika akhirnya mendengar sambungan dari pengguna. Selanjutnya adalah kesalahan. Kesalahan, sementara itu, sebagai fungsi yang kita menulis untuk menangani semua berbeda 400 dan status 500 HTTP Kode yang Anda mungkin ingin untuk mengirim kembali ke pengguna, bersama dengan pesan standar. Selanjutnya adalah beban, yang terutama Fungsi gemuk, yang tujuannya dalam hidup adalah untuk membaca dari bintang berkas pointer yang isi file ke dalam buffer dunia bahwa kita menyatakan secara global di atas [? utama. ?] Ini adalah sedikit rumit karena kita harus membaca byte dari file tetapi memeriksa setiap iterasi apakah kita sudah sudah memukul akhir file atau sesuatu yang lain yang tidak beres. Dan kita menggunakan realloc memastikan bahwa penyangga kita menggunakan apa pun yang tumbuh dan tumbuh dan berkembang dan selalu tinggal di depan jumlah byte bahwa kita harus cocok di sana. Handler, sementara itu, adalah fungsi yang mendapat disebut dengan cara memiliki terdaftar Kontrol C sebagai sinyal bahwa kita ingin mencegat. Perhatikan di sini di handler yang pada akhirnya panggilan berhenti, yang tentu saja berhenti server web. Dan sayangnya, lookup tidak dilaksanakan. Dalam semangat, ini adalah Fungsi cukup sederhana. Mengingat ekstensi file, perlu untuk kembali itu disebut MIME jenis atau tipe konten. Dan kita tentukan dalam spesifikasi apa pemetaan yang harus. Tapi Anda perlu untuk menerjemahkan akhirnya kode c. Selanjutnya adalah fungsi sama gemuk kami disebut parsing, tujuan yang dalam hidup adalah membaca, bukan dari file, tapi dari koneksi jaringan. Secara khusus, membaca dan parsing Permintaan HTTP yang berasal dari browser ke server sehingga akhirnya kita bisa mengurai di hanya header dalam permintaan line dan mengembalikan mereka kepada Anda dengan cara buffer global yang kami dinyatakan di atas [? utama. ?] Ulang, sementara itu, adalah fungsi yang kita mendefinisikan yang dipanggil iteratif dalam dari utama setiap kali Anda tentang siap untuk mulai mendengarkan untuk koneksi baru sehingga kita selalu tahu keadaan variabel kami dan agar kita sudah juga dibebaskan memori setiap yang mungkin telah dialokasikan untuk koneksi jaringan sebelumnya. Berikutnya yaitu memulai, fungsi yang kita tulis yang berisi keseluruhan banyak kode jaringan yang pada akhirnya mulai server web. Up terakhir adalah fungsi disebut berhenti, yang tidak tepat, hal itu berhenti server web. Tapi pertama-tama membebaskan memori apapun yang masih telah dialokasikan. Tapi akhirnya panggilan keluar tanpa kembali kendali fungsi utama kami. Pada akhirnya, salah satu kebanyakan teknik penting ketika mengimplementasikan web server ini adalah akan menjadi sedikit trial and error, memiliki satu browser jendela yang terbuka di sebelah kanan dan jendela terminal di kiri, server konsol jendela, sehingga Anda dapat melihat pesan yang yang ditampilkan di layar. Tapi lebih baik masih akan ketiga jendela, jendela terminal kedua, di mana Anda menggunakan Telnet, penggunaannya untuk yang ditentukan dalam spesifikasi. Dan Telnet hanya sangat program jaringan sederhana yang memungkinkan Anda untuk berpura-pura menjadi browser dalam satu jendela ketika berbicara dengan jendela lain. Dengan cara ini Anda dapat melihat persis perintah tekstual yang kembali dari server ke klien tanpa harus menusuk sekitar pengembang krom itu alat di sebaliknya antarmuka clunkier.