הצלילה עכשיו בואו: SPEAKER לקוד ההפצה ותסתכל בהקשר שבקוד שאתה כותב הולך להיות הפעלה. בסופו של היום, אתה הולך ליישם השלמות של שרת האינטרנט. אבל שאנו מספקים לך עם השלד קוד, כי יש כמה פונקציונלי, קשור במיוחד לרשת. בואו נסתכל. אז עד כאן לכיוון החלק העליון של הקובץ היא חבורה תכונה לבדוק דרישות מאקרו. עכשיו זה רק תכונה של ג, לפיה על פי חבורה של דפי גבר אתה צריך להגדיר כמה מ קבועים אלה כדי להיות אמיתיים או להיות אפילו מספרים ספציפיים, כך ש יש לך גישה לפונקציות מסוימות. אחרת הם יהיו בטלו את ולא יהיה לך גישה. אז אני כבר עשיתי את זה בדרך קריאת דפי האדם. עכשיו למטה, ב קווים 15 עד 17, ש יש חבורה של גבולות הכריזו שלמה. ואנחנו כבר בהשאלה אלה מ שרת אינטרנט פופולרי בשם אפצ'י. ואלה הם רק מספרים שהולכים לכובע המספר הכולל בתים שמותרים בהקשרים שונים לבקשת HTTP שדפדפן מותר לשלוח לי. בשלב הבא, אנו מגדירים שמיניות. עכשיו שמינייה היא רק דרך מפוארת לומר בייט, או שמונה סיביות. מתברר בפעם בייט לא היה בהכרח שמונה סיביות, כך השמינייה תמיד שמונה סיביות. אז במקרה הזה שאמצנו מה משותף ברשת עולם של קורא שמונה בתים שמינייה. כאן אני כבר צוין כי שמיניות יהיו להיות 512, כך שממש כמו בזיהוי פלילי כאשר אנו קוראים חבורה של ביטים בכל פעם, גם כאן, אנחנו הולכים לקרוא חבורה של שמיניות בכל פעם. הבא חבורה של קבצי כותרת שלמה. איך אני יודע לכולל אלה? ובכן, אני פשוט לקרוא את האדם דפים למספר הפונקציות שאנו נשתמש בחלוקה זו קוד ולכלול באלה אני הוריתי ל. ועכשיו יש לנו סוג הנתונים. אנחנו כבר הכריזו שמינייה להיות char. ואנו נראים בהמשך שזה בשימוש בכל הקוד. ואנחנו כבר הצהירו כל חבורה של אבות טיפוס, ונדריך את מהירות דרך כל אחד מפונקציות אלה. לבסוף, ואולי הכי חשוב לשמור ב אכפת בשלב זה בזה הסיפור, הוא שיש הם, למעשה כל חבורה של משתנים הגלובליים בחלק העליון של הקובץ, שורש, CFD, SFD, בקשה, קובץ וגוף. עכשיו, בדרך כלל, באמצעות כל כך הרבה בעולם משתנים, או משתנה גלובלי בכלל, לא יחזור בפועל. אבל מתברר גם אנחנו משתמשים טיפול אות טכניקה הנקראת מאוחר יותר בקוד, המאפשר לנו לזהות כאשר המשתמש מגיע משהו כמו CTRL C ונסגר השרת בחינניות. וכדי לעשות את זה בחינניות ובעצם לשחרר את הזיכרון, אנחנו צריכים להיות גישה ל משתנים הגלובליים אלה. ועכשיו בואו נסתכל על עיקרי, ש מניע את שלמותה של תכנית זו. ראשית, בחלק העליון כאן אנחנו יש לי משתנה מספר שגיאה שמופיע לא ל יש סוג, אבל זה כי זה בעצם שהוגדר בקובץ שנקרא errno.h שגיאה ש נכלל עד גבוה. אם אתה עושה את האדם לerrno למעשה ראה הגדרה לדבר הזה, אתה תראה שזה הוא משתנה הגלובלי מיוחד ש נקבע על ידי כל חבורה של פונקציות לא נכתב על ידינו, אלא על ידי המחברים של לינוקס ומערכות אחרות כדי להגדיר בעצם מספר שלמשתנה כאשר משהו משתבש כך שבעולם שאתה יכול להבין מה עשה להשתבש. עכשיו למטה תראה חדש טכניקה אולי באמצעות getopt, פונקציה שעוזרת הפקודה לנתח טיעוני קו כדי שלא צריך לטרוח מבזבזים את זמן חישוב איך לנתח משהו כמו 8080, או p המקף, או h מקף כדי לקבל עזרה. getopt מהות עושה את זה בשבילנו. ראה את דף האדם ליותר. בשלב הבא, אנחנו עושים קצת שגיאה בדיקה כדי לוודא כי מספר היציאה הוא בתוך הטווח שצוין במפרט. בשלב הבא, אנו רואים קריאה לפונקציה להתחיל, הגדרה שאנחנו מסתכל ברגע, וכשמו מרמז, זה מתחיל שרת האינטרנט. כאן יש לנו קריאה לפונקציה אות בשם שאומר, אם וכאשר אתה שומע הבקרה C מ המקלדת של המשתמש, קדימה וקוראת מטפל פונקציה שנקראת שקורה דברים ולהפסיק סופו של דבר לנקי השרת. מתחת לזה הוא מה שנראה כ לולאה אינסופית, בשורה הראשונה של ש יעילות היא קריאה לפונקציה שנקראת לאפס, שאנחנו בעצמנו ליישם בשלב מאוחר יותר כדי כדי לפנות חלק מהמדינות בעולם שלנו. אחרי זה הוא קו של קוד שתנאים בודק את התשואה ערך של מחובר. נראה עכשיו מחובר כמו נשוא, משהו שמחזיר אמת או שקר. והיא עושה, אבל יש משהו מיוחד במחובר שבזה חסימת שיחות. זה יהיה לשבת שם ולחכות עד הדפדפן של משתמש מנסה להתחבר לאינטרנט זה שרת ורק אז זה יהיה לחזור אמת או שקר, כדי שנוכל להמשיך לחלק הפנימי של אם הצהרה זו. ברגע שיש, להבחין בפונקציה זו כדי פונקציה שנקראת לנתח, אשר כתבנו, אשר מנתח את כל השמיניות, כל של הבתים המגיעים מדפדפן לשרת, כדי שנוכל למסור שלך בחזרה סופו של דבר ערך לאחד של משתנים הגלובליים אלה ש חנויות כל הבתים בפשוט הכותרות של ש בקשה, לא הגוף אם באמת היו גוף אליו. עכשיו למטה אנו מתחילים לנתח כותרות אלה כדי לחלץ קבוצת משנה של המידע כי אכפת לנו. באופן ספציפי, ל מפרט, אנחנו ראשון רציתי לבקש קו, שהוא רק שהשורה הראשונה ש אני מקווה שאומר משהו כמו גט לחתוך או איזו דרך ולאחר מכן HTTP 1.1. אנו משתמשים במטאפורה הזאת של מחט בערימת שחת לחפש מסוים תווים או כתובות. ואכן, יש מספר פונקציות בקוד ההפצה שלנו שגם אתה, עלול למצוא מועיל כאשר מחפשים ערכים מסוימים. סופו של דבר, אנחנו להעתיק בתים אלה לקו משתנה בשם, שמת לב, גם, יש לנו שהוקצה על הערימה בדרך של מערך בגודל באופן דינמי. ואנחנו מנסים בכוונה כדי למנוע קוראים malloc כי שוב, משום ש להיות הבקרה C תכונת פוטנציאל של תכנית זו, אנו לא רוצה להיות את הקוד הזה פתאום הופרע על ידי להכות המשתמשים שליטת C, שהתוצאה שלה הוא שייתכן שאין לי סיכוי למשהו בחינם אני כבר malloced. אז אני מנסה להשתמש באותה המידה הערימה הוא כאן שאני יכול. בשלב בא, חבורה של לdos כולה. המפרט יהיה להרצות על מה בדיוק צפוי כאן, אבל ההערות לתת לך רמז של מה שלפנינו. אתה קודם צריך לאמת את קו הבקשה ולוודא שזה נראה כמו מפרטי דקדוק, אם אפשר לומר כך, אומר שהוא צריך. לאחר מכן אתה צריך לחלץ משהו נקרא השאילתה, הדברים החוצה אחרי סימן שאלה, כמו ראינו בדוגמא שלנו Google כבדרך אגב בפרמטר HD. לאחר מכן, אנו לשרשר יחד השורש של שרת האינטרנט עם הדרך שהוא ב שהשורה ראשונה הבקשה וליצור את הנתיב המלא של הקובץ שאנחנו רוצים לחפש. לאחר מכן, אנחנו הולכים לוודא שהקובץ קיים וניתן לקריאה. ואז אנחנו הולכים לחלצה סיומת קובץ, .html או .php, או כמה רחבה זה ב הסוף של המחרוזת המבוקשת. בשלב הבא הוא כל חבורה של קוד שכתבנו למעשה ליצור PHP תוכן שנוצר בשבילך. על קצה המזלג, זה קוד לוקח בשם של הקובץ שברצון PHP לפרש. אנחנו עוברים אותו על ידי משהו שנקרא צינור למתורגמן של PHP. לחזור התגובה כאילו התגובה היתה קובץ עצמו. ואז אנחנו לחזר על הקובץ של ש בתים, מושכים את כולם למאגר אחד כך שבסופו אנו יכולים להדפיס אותם. ואכן, כל אלה קורא כאן לdprintf מאפשר לנו להדפיס משהו נקרא מתאר קובץ, ש רק מספר שלם המייצג את קובץ. אבל דומה מאוד ברוחו, שונה במהותו מקובץ מצביע כוכב. שימו לב איך אתה יכול להשתמש בתחביר כמו printf כאן, כך שאני יכול באופן דינמי הכנס משהו כמו האורך עבור הערך של כותרת HTTP בשם Content-אורך. וסופו של דבר השתמשתי ב פונקצית זכות לכתוב למעשה לגוף הבקשה. למרבה הצער, אנחנו מיושמים רק תמיכה באופן דינמי קבצי PHP שנוצרו. אנחנו לא יישמנו תמיכה קבצים סטטיים כמו קבצי GIF, ותמונות JPEG, וקבצי CSS ו- HTML. כי, למרבה הצער, נשאר לך להגיב למטרת הלקוח זה לעשות. אז לשם אתה תמצא שיש לא הרבה השראה בתוך הבלוק ש, אבל אם אתה קצת יותר גבוה עד כמה הלכנו על פרשנות קוד PHP, הפונקציות שאתה משתמש ב הם קצת שונים. למעשה, אתה יכול לשאול חלק מהפונקציונליות אולי מזיהוי הפלילי סט בעיה, משום ש בסופו של היום כל מה שאתה צריך לעשות כאן הוא ברגע שאתה יודע מה קובץ פתוח וברגע שאתה יודע שזה מה שנקרא סוג MIME או סוג תוכן, אתה צריך לקרוא בבתים אלה ואיכשהו לירוק אותם בחזרה החוצה. ועכשיו לסיור זה פונקציות האחרות של הקובץ. עד ראשון מחובר, אשר פשוט מחזיר אמת כשזה סוף סוף שומע חיבור ממשתמש. בשלב הבא הוא שגיאה. שגיאה, בינתיים, שכפונקציה כתב כדי להתמודד עם כל 400 השונים ומעמד 500 HTTP קודים שאולי אתה רוצה לשלוח בחזרה למשתמש, יחד עם הודעה סטנדרטית. בשלב הבא הוא עומס, במיוחד פונקציה בשרנית, שמטרתה בחיים הוא לקרוא מכוכב קובץ מצביע תוכן של קובץ לתוך מאגר עולמי שהכרזנו באופן גלובלי מעל [? עיקרי. ?] זה קצת מורכב כי אנחנו צריך לקרוא את הבתים מהקובץ אבל לבדוק בכל איטרציה אם יש לנו כבר פגע בסופו של הקובץ או משהו אחר השתבש. ואנחנו משתמשים להקצות מחדש כדי לוודא ש כל מה שמאגר אנו משתמשים גדל וגדלנו וגדל ותמיד להישאר ביתרון של מספר הבתים שאנחנו צריכים להשתלב שם. הנדלר, בינתיים, הוא הפונקציה שמקבלת נקרא בדרך של שיש רשום הבקרה C כאות כי אנחנו רוצים ליירט. שים לב כאן במטפל שסופו של דבר שיחות לעצור, מה שכמובן עוצר את שרת האינטרנט. ולמרבה הצער, בדיקה אינו מיושם. ברוח, זו היא פונקציה פשוטה למדי. בהתחשב בסיומת קובץ, שהוא צריך לחזור זה מה שנקרא MIME סוג או סוג תוכן. ואנחנו לציין במפרט מה המיפוי שחייב להיות. אבל אתה צריך לתרגם זה סופו של דבר לקוד ג. בשלב הבא היא הפונקציה דומה הבשרנית שלנו נקרא לנתח, שמטרתה בחיים הוא לקרוא, לא מקובץ, אבל מחיבור לרשת. באופן ספציפי, קריאה וניתוח בקשת HTTP כי הוא בא מדפדפן לשרת, כך ש סופו של דבר אנחנו יכולים לנתח בדיוק בכותרות בבקשת קו ולחזור אלה לך בדרך של חיץ גלובלי ש הכרזנו מעל [? עיקרי. ?] איפוס, בינתיים, הוא פונקציה שאנו מגדירים שמקבל נקרא איטרטיבי בתוך של עיקרי בכל פעם שאתה עומד מוכן להתחיל להקשיב עבור חיבור חדש כדי שתמיד יודעים המצב של המשתנים שלנו וכך שיש לנו גם שחרר את כל זיכרון ש אולי הוקצה ל חיבור לרשת קודמת. בשלב הבא הוא להתחיל, פונקציה שכתבנו המכיל את כל הרבה קוד ברשת שסופו של דבר מתחיל שרת האינטרנט. עד לאחרונה היא הפונקציה תחנה נקראת, ש עושה בדיוק את זה, זה עוצר את שרת האינטרנט. אבל קודם הוא משחרר את כל זיכרון שעדיין הוקצה. אבל סופו של דבר קורא יציאה אפילו בלי החזרת שליטה לפונקציה העיקרית שלנו. סופו של דבר, אחד מ רוב הטכניקות חשובות בעת יישום שרת אינטרנט זה הולך להיות קצת ניסוי וטעייה, יש חלון פתוח דפדפן אחד בצד ימין וחלון מסוף ב עזבתי, קונסולת השרתים חלון, כך שאתה יכול לראות את ההודעות ש שמוצג על המסך. אבל עוד יותר טוב יהיה שליש חלון, חלון מסוף שני, שבו אתה משתמש Telnet, השימוש ב שלנקבע במפרט. וTelnet הוא פשוט מאוד תכנית רשת פשוטה המאפשר לך להעמיד פנים ש להיות דפדפן בחלון אחד תוך כדי דיבור לחלון האחר. בדרך זו אתה יכול לראות בדיוק את פקודות טקסטואלי שחוזרים מהשרת ללקוח מבלי תחיבה סביב המפתחים של הכרום כלים בדרך אחרת ממשק clunkier.