ΟΜΙΛΗΤΗΣ: Τώρα ας βουτιά στον Κώδικα Διαχείρισης του Δικτύου και να ρίξετε μια ματιά στο πλαίσιο στην οποία ο κώδικας που γράφετε πρόκειται να λειτουργούν. Στο τέλος της ημέρας, θα πάμε να εφαρμόσουν το σύνολο του web server. Αλλά έχουμε παράσχει σας με το σκελετό κώδικα που έχουν κάποια λειτουργικότητα, συνδέεται ιδιαίτερα με τη δικτύωση. Ας ρίξουμε μια ματιά. Έτσι, εδώ προς την κορυφή του αρχείου είναι ένα μάτσο των δοκιμών της μακροοικονομικής απαιτήσεις. Τώρα αυτό είναι απλά ένα χαρακτηριστικό της C, σύμφωνα με την οποία σύμφωνα με ένα μάτσο σελίδες man πρέπει να ορίσετε μερικές από τις Αυτές οι σταθερές για να είναι αληθινό ή να είναι ακόμη συγκεκριμένους αριθμούς, έτσι ώστε έχετε πρόσβαση σε ορισμένες λειτουργίες. Διαφορετικά, θα είναι αδήλωτα και δεν θα έχετε πρόσβαση. Έτσι έχω κάνει αυτό με τον τρόπο διαβάζετε τις σελίδες του ο άνθρωπος. Τώρα κάτω από, σε γραμμές 15 έως 17, θα έχουν ένα σωρό όρια που δηλώνονται. Και έχουμε δανειστεί αυτά από ένα δημοφιλές web server που ονομάζεται Apache. Και αυτά είναι μόνο αριθμοί που είναι σε εξέλιξη να περιορίσει τον συνολικό αριθμό των bytes που επιτρέπονται σε διάφορα πλαίσια για την αίτηση HTTP ότι ένα πρόγραμμα περιήγησης μπορεί να μου στείλει. Στη συνέχεια, ορίζουμε οκτάδες. Τώρα μια οκτάδα είναι μόνο ένα φανταχτερό τρόπο του λέγοντας ένα byte, ή οκτώ bits. Βγάζει στο χτες ένα byte δεν ήταν απαραίτητα οκτώ bits, έτσι οκτάδα είναι πάντα οκτώ bits. Έτσι, σε αυτή την περίπτωση έχουμε υιοθετήσει ό, τι είναι κοινό στη δικτύωση κόσμο καλώντας οκτώ bytes μια οκτάδα. Εδώ έχω διευκρίνισε ότι θα οκτάδες είναι 512, έτσι ώστε να μοιάζει πολύ στην εγκληματολογία όταν διαβάζουμε ένα μάτσο bytes σε μια στιγμή, εδώ, θα πάμε να διαβάσετε ένα μάτσο οκτάδες σε μια στιγμή. Στη συνέχεια ένα σωρό αρχεία κεφαλίδας. Πώς το ξέρω για να συμπεριλάβει αυτά; Λοιπόν εγώ απλά διαβάσει τον άνθρωπο σελίδες για έναν αριθμό λειτουργιών ότι θα χρησιμοποιήσουμε σε αυτή την διανομή κώδικα και περιλαμβάνει σε αυτά Ήμουν εντολή να. Και τώρα έχουμε έναν τύπο δεδομένων. Έχουμε δηλώσει την οκτάδα να είναι μια χαρα. Και θα δούμε αργότερα ότι αυτό είναι χρησιμοποιείται σε όλη την κώδικα. Και έχουμε κηρυχθεί σωρό των πρωτοτύπων, και θα περπατήσει γρήγορα μέσα κάθε μία από αυτές τις λειτουργίες. Τέλος, και ίσως το πιο σημαντικό να διατηρηθεί σε νου σε αυτό το σημείο η ιστορία, είναι ότι υπάρχει είναι, στην πραγματικότητα ένα ολόκληρο μάτσο καθολικές μεταβλητές στην κορυφή του αρχείου, ρίζα, CFD, SFD, αίτημα, το αρχείο και το σώμα. Τώρα γενικά, χρησιμοποιώντας τόσα πολλά παγκόσμια μεταβλητές, ή καθολικές μεταβλητές σε όλους, δεν είναι το πίσω πρακτική. Αλλά τελικά είμαστε, επίσης, χρησιμοποιώντας ένα τεχνική που ονομάζεται χειρισμό σήματος αργότερα στον κώδικα, το οποίο μας επιτρέπει να ανιχνεύουν όταν ο χρήστης πατήσει κάτι όπως CTRL Ψ και να κλείσουν ο διακομιστής με χάρη. Και για να το κάνουμε αυτό με χάρη και πραγματικά δωρεάν, τη μνήμη, πρέπει να έχουν πρόσβαση σε Αυτές οι καθολικές μεταβλητές. Και τώρα ας ρίξουμε μια ματιά στα βασικά προϊόντα, τα οποία οδηγεί το σύνολο του εν λόγω προγράμματος. Πρώτον, στην κορυφή εδώ έχουν ένα σφάλμα μεταβλητό αριθμό ότι δεν φαίνεται να έχει έναν τύπο, αλλά αυτό είναι γιατί είναι πραγματικά ορίζεται σε ένα αρχείο που ονομάζεται errno.h λάθος που περιλαμβάνεται ψηλότερα. Αν το κάνετε άνθρωπο errno σε πραγματικά βλέπε τον ορισμό για αυτό το πράγμα, θα δείτε ότι αυτό είναι ένα ειδικές παγκόσμια μεταβλητή που καθορίζεται από ένα σωρό των λειτουργιών που δεν είναι γραμμένα από εμάς, αλλά από τους συντάκτες του Linux και άλλα συστήματα για να ρυθμίσετε πραγματικά ένας αριθμός για αυτή τη μεταβλητή όταν κάτι πάει στραβά, έτσι ώστε να μπορείτε παγκοσμίως καταλάβω τι έκανε να πάει στραβά. Τώρα κάτω από σας θα δείτε ένα νέο τεχνική ίσως χρησιμοποιώντας getopt, μια λειτουργία που βοηθά μεταγλώττιση εντολή τα επιχειρήματα της γραμμής, έτσι ώστε να μην κάνουμε έχετε να ασχοληθείτε σπατάλη χρόνου υπολογίζοντας πώς να αναλύσει κάτι σαν 8080, ή παύλα ρ, ή παύλα ώρα για να λάβετε βοήθεια. getopt ουσιαστικά κάνει αυτό για εμάς. Δείτε τη σελίδα man για περισσότερα. Στη συνέχεια, κάνουμε ένα κομμάτι του σφάλματος έλεγχο για να βεβαιωθείτε ότι ο αριθμός θύρας είναι εντός το καθορισμένο εύρος στο spec. Στη συνέχεια, θα δούμε μια κλήση της συνάρτησης ξεκινήσει, των οποίων ο ορισμός θα εξετάσουμε σε μια στιγμή, και το όνομά του προτείνει, αυτό ξεκινά τον web server. Εδώ έχουμε μια κλήση σε λειτουργία που ονομάζεται σήμα που λέει, αν και όταν ακούτε Ελέγχου C από πληκτρολόγιο του χρήστη, να προχωρήσει και να καλέσετε μια λειτουργία που ονομάζεται χειριστής που πρόκειται να τελικά καθαρά τα πράγματα και να σταματήσει ο διακομιστής. Κάτω από αυτό είναι αυτό που φαίνεται να είναι ένα άπειρο βρόχο, η πρώτη γραμμή της οποίας ουσιαστικά είναι μια πρόσκληση σε μια λειτουργία που ονομάζεται επαναφορά, η οποία τους εαυτούς μας εφαρμοστεί αργότερα, προκειμένου να απελευθερώσει μερικά από τα παγκόσμια μελών μας. Μετά από αυτό είναι μια σειρά από κώδικα, προκύπτει ότι υπό όρους ελέγχει την επιστροφή αξία της συνδεδεμένης. Τώρα που συνδέεται μοιάζει με ένα κατηγόρημα, κάτι που επιστρέφει true ή false. Και το κάνει, αλλά δεν υπάρχει κάτι το ιδιαίτερο σε συνδεδεμένη υπό την έννοια ότι είναι μια κλήση κλείδωμα. Θα κάθεται εκεί και περιμένει μέχρι ο browser του χρήστη προσπαθεί να συνδεθεί με αυτό το web server και μόνο τότε θα είναι επιστρέφουν αληθείς ή ψευδείς, έτσι ώστε να προχωρήσουμε στο εσωτερικό αυτού του if. Μόλις εκεί, παρατηρήσετε αυτή τη λειτουργία για ένα λειτουργία που ονομάζεται μαϊντανός, το οποίο γράψαμε, η οποία αναλύει όλες τις οκτάδες, όλα των bytes που προέρχονται από ένα πρόγραμμα περιήγησης στο διακομιστή, έτσι ώστε να μπορούμε να παραδώσει σας πίσω τελικά μια τιμή σε ένα από αυτές τις παγκόσμιες μεταβλητές που αποθηκεύει όλα τα bytes σε μόλις επικεφαλίδες που αίτηση, όχι το σώμα εάν υπήρχε πράγματι ένα σώμα σε αυτό. Τώρα κάτω από αρχίσουμε να αναλύσει αυτές τις κεφαλίδες για να εξαγάγετε ένα υποσύνολο των πληροφοριών ότι νοιαζόμαστε για. Ειδικότερα, κατά το προδιαγραφή, πρέπει πρώτα ήθελε να ζητήσει γραμμή, η οποία είναι ακριβώς ότι πρώτη γραμμή ότι ελπίζω να λέει κάτι σαν get κάθετο ή κάποια διαδρομή και, στη συνέχεια, HTTP 1.1. Είμαστε χρησιμοποιώντας αυτό το αλληγορία από μια βελόνα στα άχυρα να ψάξουν για συγκεκριμένα χαρακτήρες ή διευθύνσεις. Και πράγματι, υπάρχει ένας αριθμός λειτουργίες στον κώδικα της διανομής μας ότι και εσείς, επίσης, μπορεί να βρει χρήσιμες όταν ψάχνουν για συγκεκριμένες τιμές. Τελικά, αντιγράφουμε αυτά τα bytes σε μια μεταβλητή που ονομάζεται γραμμή, που παρατηρήσετε, επίσης, έχουμε διατεθεί στη στοίβα μέσω ενός δυναμικά μεγέθους συστοιχία. Και είμαστε προσπαθεί σκόπιμα να αποφεύγουν να καλέσουν malloc γιατί και πάλι, επειδή του ελέγχου C είναι ένα δυναμικό χαρακτηριστικό του προγράμματος αυτού, εμείς Δεν θέλω να έχω αυτόν τον κώδικα ξαφνικά διακόπτεται από το χτύπημα του χρήστη Ελέγχου C, το αποτέλεσμα της οποίας είναι ότι μπορεί να μην έχω την ευκαιρία για δωρεάν κάτι που έχω malloced. Έτσι, προσπαθώ να χρησιμοποιήσει ως πολύ της στοίβας είναι μπορώ εδώ. Έπειτα επάνω, ένα σωρό στο DOS. Η προδιαγραφή θα αναπτύξω για το τι ακριβώς είναι αναμενόμενο εδώ, αλλά τα σχόλια σας δώσω μια ιδέα για το τι βρίσκεται μπροστά μας. Θα πρέπει πρώτα να επικυρώνει τη γραμμή αίτημα και βεβαιωθείτε ότι μοιάζει με το προδιαγραφές γραμματική, να το πω έτσι, λέει ότι θα έπρεπε. Θα πρέπει στη συνέχεια να εξαγάγετε κάτι ονομάζεται το ερώτημα, τα πράγματα έξω μετά από ένα ερωτηματικό, όπως είδαμε με το Google παράδειγμα μας στο πέρασμα σε μια παράμετρο HD. Στη συνέχεια ενώσετε μαζί η ρίζα του web server με την πορεία που είναι σε ότι το αίτημα πρώτης γραμμής και αποτελούν την πλήρη διαδρομή του το αρχείο που θέλετε να αναζητήσετε. Στη συνέχεια, θα πάμε για να βεβαιωθείτε ότι ότι το αρχείο υπάρχει και είναι αναγνώσιμο. Και μετά θα πάμε για να εξαγάγετε της επέκταση αρχείου, το .html ή το .php, ή κάποια τέτοια επέκταση που είναι κατά το τέλος του string ζητηθεί. Επόμενο είναι μέχρι ένα ολόκληρο μάτσο κώδικα που γράψαμε να δημιουργήσει πραγματικά PHP περιεχόμενο που δημιουργείται για εσάς. Με λίγα λόγια, αυτό κώδικας λαμβάνει το όνομα του αρχείου που θέλετε PHP για να ερμηνεύσει. Εμείς να περάσει από κάτι που ονομάζεται ένα σωλήνα στον διερμηνέα της PHP. Πάρτε πίσω την απάντηση σαν η απάντηση ήταν η ίδια ένα αρχείο. Και τότε θα επαναλάβει πάνω από το αρχείο του bytes, τραβώντας όλα αυτά σε ένα ρυθμιστικό έτσι ώστε να μπορούμε τελικά να τις εκτυπώσετε. Πράγματι, όλα αυτά καλεί εδώ για να dprintf μας επιτρέπει να εκτυπώσετε κάτι ονομάζεται Περιγραφέας αρχείο, το οποίο είναι απλά ένας ακέραιος ότι αντιπροσωπεύει ένα αρχείο. Πολύ παρόμοια στο πνεύμα, αλλά ριζικά διαφορετικό από ένα αρχείο Κατηγορία δείκτη. Ανακοίνωση για το πώς μπορείτε να χρησιμοποιήσετε σύνταξη, όπως printf εδώ, ώστε να μπορώ δυναμικά εισάγετε κάτι σαν το μήκος για την αξία του μια κεφαλίδα HTTP ονομάζεται Content-Length. Και τελικά θα χρησιμοποιηθεί ο λειτουργία δικαίωμα να γράψει πραγματικά το σώμα του αιτήματος. Δυστυχώς, υλοποιήσαμε μόνο υποστήριξη για δυναμικά δημιουργούνται αρχεία PHP. Εμείς δεν εφάρμοσε υποστήριξη στατικά αρχεία, όπως gifs, και αρχεία JPEG, και CSS και HTML αρχεία. Αυτό, δυστυχώς, επαφίεται σε σας να ανταποκριθεί στο σκοπό του πελάτη αυτό να το κάνουμε. Έτσι, εκεί θα βρείτε ότι υπάρχει δεν είναι πολύ έμπνευση εντός αυτού του συγκροτήματος, αλλά αν είναι λίγο πιο ψηλά από το πόσο πήγαμε σχετικά με την ερμηνεία κώδικα PHP, οι λειτουργίες που θα χρησιμοποιήσετε είναι λίγο διαφορετικά. Στην πραγματικότητα, μπορείτε να δανειστείτε μερικές από τις λειτουργίες ίσως από τις εγκληματολογίας σετ πρόβλημα, επειδή Στο τέλος της ημέρας το μόνο που χρειάζεται να κάνουμε εδώ είναι Μόλις ξέρετε τι το άνοιγμα του αρχείου και μόλις ξέρετε ότι είναι το λεγόμενο Τύπος MIME ή τύπο περιεχομένου, θα πρέπει να διαβάσετε σε αυτά τα bytes και με κάποιο τρόπο να τους φτύνουν πίσω έξω. Και τώρα μια περιοδεία του αυτό άλλες λειτουργίες αρχείου. Πρώτα είναι συνδεδεμένο, η οποία απλά επιστρέφει true όταν ακούει τελικά ένα σύνδεση από ένα χρήστη. Επόμενο είναι λάθος. Σφάλμα, εν τω μεταξύ, ως μια λειτουργία που έγραψε για να χειριστεί όλα τα διάφορα 400 και την κατάσταση HTTP 500 κωδικούς που μπορεί να θέλετε να στείλει πίσω στον χρήστη, μαζί με ένα τυπικό μήνυμα. Επόμενο είναι μέχρι το φορτίο, ιδιαίτερα σαρκωμένο λειτουργία, των οποίων ο σκοπός στη ζωή είναι να διαβάσει από ένα αστέρι αρχείο το δείκτη του περιεχόμενα ενός αρχείου σε ένα παγκόσμιο ρυθμιστικό ότι δηλώσαμε σε παγκόσμιο επίπεδο ανωτέρω [; κύριος. ?] Αυτό είναι ένα σύνθετο κομμάτι, γιατί εμείς Πρέπει να διαβάσετε το byte από το αρχείο αλλά ελέγχει σε κάθε επανάληψη αν έχουμε ήδη χτύπησε το τέλος του αρχείου ή κάτι άλλο έχει πάει στραβά. Και χρησιμοποιούμε realloc να βεβαιωθείτε ότι Όποια και αν είναι ρυθμιστικό είμαστε χρησιμοποιώντας αυξάνεται και μεγαλώνει και αναπτύσσεται και πάντα διαμονή τους μπροστά από τον αριθμό των bytes ότι θα πρέπει να ταιριάζει εκεί. Handler, εν τω μεταξύ, είναι Η συνάρτηση που παίρνει καλείται μέσω της έχοντας καταχωρηθεί Ελέγχου C ως σήμα ότι θέλουμε να υποκλέψει. Παρατηρήστε εδώ στο χειριστή ότι, τελικά, ζητεί να σταματήσει, το οποίο φυσικά σταματά τον web server. Και δυστυχώς, αναζήτηση δεν εφαρμόζεται. Σε πνεύμα, αυτό είναι ένα αρκετά απλή λειτουργία. Λαμβάνοντας υπόψη μια επέκταση του αρχείου, χρειάζεται για να επιστρέψετε λεγόμενη MIME είδος ή τύπο περιεχομένου. Και εμείς να προβλέψει στις προδιαγραφές τι η χαρτογράφηση θα πρέπει να είναι. Αλλά θα πρέπει να μεταφράσουν εν τέλει να γ κώδικα. Επόμενο είναι ομοίως σαρκωμένο λειτουργία μας ονομάζεται μεταγλώττιση, σκοπός του οποίου στη ζωή είναι να διαβάσει, όχι από ένα αρχείο, αλλά από μια σύνδεση δικτύου. Συγκεκριμένα, την ανάγνωση και την ανάλυση του Αίτηση HTTP που προέρχονται από ένα πρόγραμμα περιήγησης στο διακομιστή, έτσι ώστε τελικά μπορούμε να αναλύσει ακριβώς στα κεφαλίδες στην αίτηση γραμμή και να επιστρέψει αυτά που σας μέσω ενός παγκόσμιου ρυθμιστικού ότι που ανακοινώνονται ανωτέρω [; κύριος. ?] Επαναφορά, εν τω μεταξύ, είναι ένα λειτουργία που ορίζουμε ότι φώναξαν επαναληπτικά μέσα των κύριων κάθε φορά που είστε έτοιμος έτοιμοι να αρχίσετε να ακούτε για μια νέα σύνδεση έτσι ώστε να γνωρίζετε πάντα η κατάσταση των μεταβλητών μας και έτσι ώστε να έχουμε επίσης ελευθερωθεί μνήμη που θα μπορούσαν να έχουν διατεθεί για μια προηγούμενη σύνδεση με το δίκτυο. Το επόμενο είναι να ξεκινήσει, η λειτουργία που γράψαμε που περιέχει μια ολόκληρη πολύ κώδικα δικτύωσης που ξεκινά τελικά τον web server. Τελευταία up είναι η λειτουργία που ονομάζεται στάση, η οποία κάνει ακριβώς αυτό, σταματά τον web server. Αλλά πρώτα απελευθερώνει περισσότερη μνήμη ότι εξακολουθεί να έχει διατεθεί. Αλλά αυτό απαιτεί τελικά την έξοδο χωρίς καν να επιστρέφει τον έλεγχο προς την κύρια λειτουργία μας. Τελικά, ένα από τα πιο σημαντικές τεχνικές Κατά την εφαρμογή αυτού του web server είναι πρόκειται να είναι ένα κομμάτι της δοκιμής και του λάθους, έχει ένα πρόγραμμα περιήγησης στο ανοιχτό παράθυρο στα δεξιά και ένα παράθυρο τερματικού στο αριστερά, η κονσόλα διακομιστές παράθυρο, έτσι ώστε να να δείτε τα μηνύματα που είναι που εμφανίζεται στην οθόνη. Αλλά ακόμα καλύτερα θα ήταν ένα τρίτο παράθυρο, ένα δεύτερο παράθυρο του τερματικού, στο οποίο μπορείτε να χρησιμοποιήσετε το Telnet, τη χρήση για τις οποίες προβλέπεται στο spec. Και Telnet είναι μόνο ένα πολύ απλό πρόγραμμα δικτύου που σας επιτρέπει να προσποιούνται ότι είναι ένα πρόγραμμα περιήγησης σε ένα παράθυρο ενώ μιλώντας στο άλλο παράθυρο. Με αυτό τον τρόπο μπορείτε να δείτε ακριβώς οι εντολές κειμένου που έρχονται πίσω από το διακομιστή στον πελάτη χωρίς να χρειάζεται να σπρώχνει γύρω προγραμματιστής του Chrome εργαλεία σε μια κατά τα άλλα clunkier διεπαφή.