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.