SPEAKER: Sekarang mari kita menyelam ke dalam kod pengagihan
dan kita lihat pada konteks di mana kod yang anda menulis
akan beroperasi.
Pada akhir hari, anda akan melaksanakan
keseluruhan pelayan web.
Tetapi kita telah disediakan anda dengan rangka
kod yang mempunyai beberapa fungsi, terutamanya yang berkaitan dengan rangkaian.
Mari kita lihat satu.
>> Jadi di sini ke arah bahagian atas fail adalah sekumpulan
ciri menguji keperluan makro.
Sekarang ini hanya ciri c, di mana mengikut sekumpulan halaman man
anda perlu menentukan beberapa pemalar ini adalah benar
atau untuk menjadi lebih nombor tertentu supaya anda mempunyai akses kepada fungsi-fungsi tertentu.
Jika tidak mereka akan tidak diisytiharkan dan anda tidak akan mempunyai akses.
Jadi saya telah melakukan ini dengan cara membaca halaman manusia.
Sekarang ke bawah di bawah, di garis 15 melalui 17, kita
mempunyai sejumlah besar had diisytiharkan.
>> Dan kami telah dipinjam ini dari pelayan web popular dipanggil Apache.
Dan ini adalah hanya nombor yang akan
untuk menghadkan jumlah bait yang dibenarkan
dalam pelbagai konteks untuk permintaan HTTP bahawa pelayar yang dibenarkan untuk menghantar saya.
Seterusnya, kita menentukan octet.
Sekarang octet yang hanya cara yang mewah daripada menyebut bait, atau lapan bit.
Rupa-rupanya dalam tadi bait tidak semestinya lapan bit,
jadi octet sentiasa lapan bit.
Jadi dalam kes ini kita telah diterima pakai apa yang biasa dalam rangkaian
dunia memanggil lapan bait octet satu.
>> Di sini saya telah dinyatakan bahawa octet akan menjadi 512, supaya sama seperti dalam forensik
apabila kita membaca sekumpulan bait pada satu masa, di sini juga,
kita akan membaca sekumpulan octet pada satu masa.
Seterusnya sejumlah besar fail header.
Bagaimana saya tahu untuk memasukkan ini?
Well, saya hanya membaca orang laman untuk beberapa fungsi
bahawa kita akan menggunakan dalam pengagihan ini kod dan termasuk dalam orang-orang yang
Saya telah diarahkan untuk.
>> Dan sekarang kita mempunyai jenis data.
Kami telah diisytiharkan octet untuk menjadi char a.
Dan kita akan lihat nanti bahawa itulah digunakan di seluruh kod.
Dan kami telah mengisytiharkan sejumlah besar prototaip,
dan kami akan berjalan cepat melalui setiap fungsi-fungsi itu.
Akhir sekali, dan mungkin yang paling penting yang perlu
keberatan pada ketika ini dalam cerita, adalah bahawa terdapat
, sebenarnya keseluruhan sekumpulan pembolehubah global
di bahagian atas fail, akar, CFD, SFD, permintaan, fail dan badan.
>> Sekarang umumnya, menggunakan begitu banyak global pembolehubah, atau pembolehubah global di semua,
bukan amalan belakang.
Tetapi ternyata kami juga menggunakan teknik pengendalian dipanggil isyarat kemudian
dalam kod, yang membolehkan kita untuk mengesan apabila pengguna menekan sesuatu
seperti CTRL C dan menutup pelayan anggun.
Dan untuk berbuat demikian anggun dan benar-benar bebas memori,
kita perlu mempunyai akses kepada pembolehubah global.
>> Dan sekarang mari kita lihat utama, yang memacu keseluruhan program ini.
Pertama, di bahagian atas di sini kita mempunyai nombor ralat pembolehubah
yang nampaknya tidak mempunyai jenis, tetapi itu
kerana ia sebenarnya yang ditakrifkan dalam fail yang dipanggil
kesilapan yang errno.h dimasukkan sehingga lebih tinggi.
Jika anda manusia errno untuk benar-benar lihat takrifan bagi perkara ini,
anda akan melihat bahawa ini adalah satu pembolehubah global khas yang
ditetapkan oleh sejumlah besar fungsinya tidak bertulis
oleh kami, tetapi oleh pengarang Linux dan sistem lain untuk benar-benar menetapkan
nombor kepada yang berubah-ubah apabila sesuatu pergi salah supaya anda boleh secara global
memikirkan apa yang telah berlaku.
>> Sekarang turun di bawah anda akan melihat baru teknik mungkin menggunakan getopt,
fungsi yang membantu arahan hurai argumen baris supaya kita tidak
perlu mengganggu masa membuang memikirkan bagaimana untuk menghuraikan sesuatu seperti 8080,
atau p dash, atau dash h untuk mendapatkan bantuan.
getopt dasarnya adakah itu untuk kami.
Lihat halaman lelaki itu lebih.
>> Seterusnya, kami melakukan sedikit kesilapan memeriksa untuk memastikan
bahawa nombor port adalah dalam julat yang dinyatakan dalam spec.
Seterusnya, kita melihat panggilan ke fungsi yang mula, yang definisi kami akan
melihat dalam sekejap, dan sebagai namanya mencadangkan, ini bermula pelayan web.
Di sini kita mempunyai panggilan ke fungsi dipanggil isyarat yang mengatakan,
jika dan apabila anda mendengar Kawalan C daripada keyboard pengguna, pergi ke depan dan memanggil
fungsi dipanggil pengendali perkara yang berlaku perkara yang akhirnya bersih dan berhenti
pelayan.
>> Di bawah adalah bahawa apa yang kelihatan sebagai satu gelung tak terhingga, baris pertama yang
berkesan adalah panggilan untuk fungsi yang dipanggil
menetapkan semula, yang kita diri kita sendiri melaksanakan di kemudian hari bagi
untuk membebaskan beberapa negeri global kami.
Selepas itu adalah garis kod yang bersyarat
ialah memeriksa pulangan nilai yang disambungkan.
Sekarang kelihatan berkaitan seperti predikat yang, sesuatu yang mengembalikan benar atau palsu.
Dan ia, tetapi ada sesuatu yang istimewa dalam berhubung
dalam bahawa itu panggilan sekatan.
Ia akan duduk di sana dan menunggu sehingga pelayar pengguna
cuba untuk menyambung ke web ini pelayan dan hanya kemudian akan ia
kembali benar atau salah supaya kita teruskan untuk bahagian dalam ini jika kenyataan.
>> Apabila di sana, melihat fungsi ini kepada fungsi dipanggil hurai, yang kita menulis,
yang mem-parsing semua octet, semua daripada bait yang datang dari pelayar
kepada pelayan, supaya kita boleh menyerahkan anda kembali akhirnya satu nilai kepada satu
orang-orang pembolehubah global yang kedai semua bait dalam hanya
tajuk itu permintaan, bukan badan
jika terdapat sebenarnya badan kepadanya.
>> Sekarang turun di bawah kita mula menghuraikan mereka header untuk mengekstrak
subset maklumat bahawa kita mengambil berat tentang.
Secara khususnya, setiap yang spesifikasi, kita pertama
mahu meminta talian, yang merupakan hanya itu talian yang pertama yang
mudah-mudahan mengatakan sesuatu seperti get mengurangkan atau beberapa jalan dan kemudian HTTP 1.1.
Kami menggunakan metafora ini jarum dalam sisa rumput kering
mencari tertentu aksara atau alamat.
Dan sesungguhnya, ada beberapa fungsi dalam kod pengedaran kami
bahawa anda juga mungkin mendapati membantu ketika mencari nilai-nilai tertentu.
>> Akhirnya, kami menyalin bait ini ke garis ubah dikenali sebagai,
yang perasan, terlalu, sudah tentu kita diperuntukkan pada timbunan
melalui pelbagai dinamik yang bersaiz.
Dan kita sengaja cuba untuk mengelakkan memanggil malloc
kerana sekali lagi, kerana Kawalan C kerana
ciri potensi program ini, kita tidak mahu mempunyai kod ini tiba-tiba
diganggu oleh memukul pengguna Kawalan C, hasil yang
adalah bahawa saya tidak mungkin mempunyai peluang yang untuk sesuatu yang percuma saya malloced.
Jadi, saya cuba untuk menggunakan sebanyak daripada tindanan adalah saya boleh di sini.
>> Selanjutnya, sejumlah besar kepada dos.
Penentuan itu akan menjelaskan secara terperinci pada betul-betul apa yang diharapkan di sini,
tetapi ulasan memberikan anda tanda-tanda bahawa apa yang akan berlaku.
Anda perlu terlebih dahulu mengesahkan garis permintaan
dan memastikan bahawa ia kelihatan seperti spesifikasi tata bahasa, boleh dikatakan,
kata yang sepatutnya.
Kemudian anda perlu untuk mendapatkan sesuatu dipanggil pertanyaan tersebut, bahan yang keluar
selepas tanda tanya, seperti yang kita lihat dengan contoh Google kami
di lulus dalam parameter HD.
Kami kemudian menyatukan bersama akar pelayan web
dengan jalan yang ada di bahawa permintaan baris pertama
dan membentuk laluan penuh fail yang kita mahu mencari.
>> Selepas itu, kita akan memastikan bahawa fail wujud dan boleh dibaca.
Dan kemudian kami akan mengeluarkan mereka sambungan fail, yang .html atau .php itu,
atau beberapa tempoh lanjutan itu di sangat akhir untuk rentetan yang diminta.
Sehingga seterusnya ialah keseluruhan sekumpulan kod kita menulis
untuk benar-benar menjana PHP menjana kandungan untuk anda.
Secara ringkasnya, ini kod mengambil nama
fail yang anda mahu PHP untuk mentafsir.
Kami menyampaikan ia dengan sesuatu yang dinamakan paip ke dalam jurubahasa PHP ini.
Kembali sambutan yang seolah-olah sambutan adalah fail sendiri.
Dan kemudian kita melelar lebih yang fail bait, menarik mereka semua ke dalam satu penampan
supaya kita dapat akhirnya mencetak mereka keluar.
>> Sesungguhnya, semua ini panggilan di sini untuk dprintf
membolehkan kita untuk mencetak sesuatu dipanggil penghurai fail, yang
hanya integer yang mewakili fail.
Hampir sama di hadapan Allah, tetapi berbeza dari fail
penunjuk bintang.
Perhatikan bagaimana anda boleh menggunakan sintaks seperti printf sini supaya saya boleh dinamik
memasukkan sesuatu seperti panjang untuk nilai sebuah header HTTP
dipanggil Panjang Kandungan.
Dan akhirnya saya menggunakan fungsi betul untuk benar-benar menulis
badan untuk permintaan itu.
>> Malangnya, kami hanya dilaksanakan sokongan untuk secara dinamik
dijana PHP fail.
Kami tidak melaksanakan sokongan untuk fail statik seperti gifs, dan JPEG,
dan CSS dan HTML fail.
Bahawa, malangnya, yang tinggal untuk anda untuk bertindak balas untuk tujuan pelanggan
ini lakukan.
Jadi di sana anda akan mendapati bahawa terdapat tidak banyak inspirasi dalam blok itu,
tetapi jika anda sedikit lebih tinggi pada bagaimana kami pergi tentang mentafsirkan kod PHP,
fungsi yang anda akan menggunakan adalah sedikit berbeza.
>> Malah, anda boleh meminjam beberapa fungsi
mungkin daripada forensik set masalah, kerana
pada akhir hari itu semua yang anda perlu lakukan di sini adalah apabila anda tahu apa yang fail terbuka
dan sebaik sahaja anda tahu ia apa yang dipanggil Jenis MIME atau jenis kandungan,
anda perlu membaca dalam mereka bytes dan entah bagaimana meludah mereka keluar.
>> Dan sekarang lawatan ini fungsi lain fail.
Sehingga pertama disambungkan, yang hanya mengembalikan benar
apabila ia akhirnya mendengar yang sambungan daripada pengguna.
Sehingga seterusnya ialah kesilapan.
Ralat Sementara itu, sebagai fungsi kita menulis untuk mengendalikan semua berbeza 400
dan status HTTP 500 kod yang anda mungkin mahu
untuk menghantar kembali kepada pengguna, bersama-sama dengan mesej standard.
>> Sehingga seterusnya ialah beban, yang terutama fungsi penuh daging, yang tujuan dalam kehidupan
adalah untuk membaca dari fail bintang penunjuk kandungan fail ke dalam buffer global
bahawa kita diisytiharkan di seluruh dunia atas [? utama. ?]
Ini adalah agak rumit kerana kita perlu membaca bait dari fail
tetapi memeriksa setiap lelaran sama ada kita telah pun
melanda akhir fail atau sesuatu yang lain telah berlaku.
Dan kita menggunakan realloc memastikan bahawa apa penampan kita menggunakan berkembang
dan yang semakin meningkat dan berkembang dan sentiasa mendahului bilangan bait
bahawa kita perlu menyesuaikan diri di sana.
Pengendali, sementara itu, adalah fungsi yang mendapat
dipanggil dengan cara yang mempunyai berdaftar Kawalan C sebagai isyarat
yang kita mahu untuk memintas.
Perhatikan di sini dalam pengendali bahawa ia akhirnya
panggilan berhenti, yang sudah tentu berhenti pelayan web.
Dan malangnya, lookup tidak dilaksanakan.
Di hadapan Allah, ini adalah fungsi yang agak mudah.
Memandangkan sambungan fail, ia memerlukan untuk kembali ia dipanggil MIME
jenis atau jenis kandungan.
Dan kita nyatakan dalam penentuan itu apa pemetaan yang mesti.
Tetapi anda perlu untuk menterjemahkan ia akhirnya c kod.
>> Sehingga seterusnya ialah fungsi juga penuh daging kami dipanggil hurai, tujuan yang dalam kehidupan
adalah untuk membaca, bukan dari fail, tetapi dari sambungan rangkaian.
Secara khusus, membaca dan menghuraikan yang Permintaan HTTP yang yang datang dari pelayar
kepada pelayan supaya akhirnya kita dapat menghuraikan
pada hanya pengepala dalam permintaan itu talian dan kembali mereka kepada anda
melalui penampan global yang kita diisytiharkan di atas [? utama. ?]
>> Tetap semula, sementara itu, adalah fungsi yang kita menentukan
yang mendapat dipanggil secara berulang dalam daripada utama setiap kali anda mengenai
bersedia untuk mula mendengar untuk sambungan baru
supaya kita sentiasa tahu keadaan pembolehubah kami
dan supaya kita kena juga membebaskan apa-apa memori yang
mungkin telah diperuntukkan untuk sambungan rangkaian sebelumnya.
Sehingga seterusnya ialah bermula, fungsi yang kita menulis
yang mengandungi keseluruhannya banyak kod rangkaian
yang akhirnya bermula pelayan web.
>> Sehingga lepas adalah fungsi dipanggil stop, yang
tidak tepat itu, ia berhenti pelayan web.
Tetapi pertama ia membebaskan apa-apa memori yang masih telah diperuntukkan.
Tetapi ia akhirnya panggilan keluar tanpa kembali kawalan
kepada fungsi utama kami.
Akhirnya, salah satu daripada teknik yang paling penting
apabila melaksanakan pelayan web ini adalah akan menjadi sedikit percubaan dan kesilapan,
mempunyai satu pelayar tetingkap terbuka di sebelah kanan dan tetingkap terminal di
kiri, konsol pelayan tetingkap, supaya anda
boleh melihat mesej yang dipaparkan pada skrin.
>> Tetapi lebih baik lagi akan menjadi satu pertiga tetingkap, tetingkap terminal kedua,
di mana anda menggunakan Telnet, penggunaan bagi yang ditetapkan dalam spec.
Dan Telnet hanya sangat program rangkaian mudah
yang membolehkan anda untuk berpura-pura menjadi pelayar dalam satu tetingkap
ketika bercakap kepada tetingkap yang lain.
Dengan cara ini anda boleh melihat betul-betul perintah teks
yang akan datang kembali dari pelayan untuk pelanggan
tanpa perlu poking sekitar pemaju krom ini
alat dalam cara lain antara muka clunkier.