PracticU

תיקון תקלות בשרת

בלי כתוביותעם כתוביות
PracticU › קורס C למתקדמים - עבודה מול חומרה Win32 › תיקון תקלות בשרת
מילון מושגים:
שרת - מחשב או תוכנה שמספקים שירות למחשבים אחרים (לקוחות) ברשת, למשל אחסון קבצים, אתר אינטרנט או מסד נתונים, ומגיבים לבקשות שלהם.
באג - תקלה או שגיאה בקוד שגורמת לתוכנה להתנהג בניגוד למצופה.
לקוח - תוכנה או מחשב שפונים לשרת ומבקשים ממנו שירות או מידע, למשל דפדפן שמבקש דף אינטרנט.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
תהליכון - יחידת ביצוע בתוך תהליך, המאפשרת להריץ כמה מהלכים במקביל ולחלוק את אותו זיכרון.
חריגה - מצב שגיאה שמתרחש בזמן ריצת התוכנית ומפסיק את המהלך הרגיל, אלא אם הקוד תופס ומטפל בו.
Visual Studio - סביבת פיתוח משולבת (IDE) של מיקרוסופט לכתיבה, ניפוי והרצה של קוד, בעיקר בשפות .NET.

תיקון תקלות בשרת
השיעור ממשיך לאתר באג בשרת צ'אט ב-C++ עם Winsock. מריצים שרת ושני לקוחות, ומגלים שהודעה מלקוח אחד מגיעה לשרת ואחרת לא. הבדיקה נעשית בעזרת הדפסות ונקודות עצירה בדיבאגר.
השלבים העיקריים
1. זיהוי התסמין: ההודעה של לקוח A מופיעה בשרת, וההודעה של לקוח B לא. מכאן המסקנה שמשהו לא תקין בצד השרת.
2. הדפסה אחרי accept: מוסיפים הדפסה מיד אחרי accept, כדי לוודא שהחיבור התקבל, ועוד הדפסה אחרי ששומרים את הלקוח במערך.
3. תא פנוי: מוסיפים הודעה no more space למקרה שהלולאה מסתיימת בלי למצוא תא פנוי, כדי לדעת מתי המערך מלא.
4. Threads: בדיבאגר רואים שרק thread אחד של לקוח רץ, ושה-thread השני לא נוצר. נוסף ניסיון לתת שם ל-thread כדי לזהות אותו בחלון ה-Threads, אבל לא נמצאה בשיעור דרך פשוטה לעשות זאת ב-C++, והנושא נשאר פתוח.
5. אתחול המערך: מתברר שאתחול מערך עם ערך אחד מאפס את שאר התאים, ולכן התאים לא מקבלים INVALID_SOCKET. הפתרון: לולאה שמציבה INVALID_SOCKET בכל התאים בעת עליית השרת.
6. ניקוי לקוח מתנתק: כשלקוח מתנתק, הוא מוסר מהמערך והסוקט שלו נסגר. בעבר הסגירה גרמה לחריגה בזמן שליחת ההודעה לשאר הלקוחות, והתיקון הוא לדלג על הלקוח שהתנתק.
7. בדיקה עם שלושה לקוחות: אחרי התיקונים מתחברים שלושה לקוחות ונשלחות הודעות. הלקוחות עצמם לא מקבלים מהשרת שום מסר, ולכן המשימה לשבוע הבא: הלקוחות יקשיבו ויציגו הודעות ואירועים מהשרת.
פקודות והגדרות
- printf משמש להדפסות זמניות שמסמנות איזה שלב רץ בשרת וללקוח.
- ב-Visual Studio: נקודת עצירה (breakpoint) וחלון Threads בדיבאגר, ושימוש ב-Edit and Continue כדי לתקן קוד בזמן ריצה.
שימו לב
- כשהמערך מלא השרת לא קולט לקוח נוסף. זו החלטה שצריך לקבל מראש, איך מתנהגים כשאין מקום פנוי.
אחרי השיעור אפשר לאתר בעזרת הדפסות ונקודות עצירה בעיות של מערך לקוחות ושל threads בשרת צ'אט, ולתקן אותן צעד אחר צעד.
השיעור הבא בקורס: הרצת שרת ושני לקוחות במקביל

פרקי ההרצאה: תיקון תקלות בשרת

  1. 00:00

    הבעיה: הקליינט לא מקבל הודעות מהשרת

  2. 01:58

    הוספת הדפסות לאחר accept בשרת

  3. 04:22

    טיפול במקרה שאין מקום פנוי לקליינט

  4. 06:43

    ניפוי הקליינט והדפסות בתחילת הפונקציה

  5. 08:15

    בדיקת Threads בזמן ריצה

  6. 09:53

    מתן שמות ל-Threads של הקליינטים

  7. 11:17

    מדוע אין Thread לקליינט השני

  8. 14:29

    אתחול מערך הקליינטים בלולאה

תמלול ההרצאה: תיקון תקלות בשרת

הטקסט המלא של הדקות הראשונות בהרצאה «תיקון תקלות בשרת» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:04

    טוב אנחנו ממשיכים אז רצתי פה client a וclient b ואת הסרבר מה שאני שם לב זה שאני כותב בclient הזה 111 enter אז הוא כותב את זה כאן וכשאני כותב פה 2222 enter אז הוא לא כותב את זה כאן יפה אז פתחתי פה הvisual studio הזה מריץ את הסרבר הזה הvisual studio הזה מריץ את הclient

  2. 00:31

    הזה הוויז'ול סטודיו הזה מריץ את הקליינט הזה אז אני רוצה לדבק, אז בואו נדבק אז השאלה היא האם הוא בכלל משדר, האם הוא בכלל מקבל יש לי תחושה שמה, שמשהו לא בסדר בצד של השרת, זו התחושה שלי אז השרת זה הוויז'ול סטודיו השמאלי ביותר, אנחנו לא צריכים את זה

  3. 01:01

    ואנחנו כן צריכים את זה, אז השרת, הכובד של השרת ובואו נראה מה יש לנו בשלב, בואו נצמצם, עכבר ימני ואוטליינינג וקולאב ובלי קשר, בואו נניח שהבעיה היא בהתחלה, אז מיין, בואו נעקוב אחרי מיין, מיין עשה קרייט רייט והוא עושה אקספט פרוק,

  4. 01:30

    אז בואו נלך לאקספט פרוק, נעשה אקספט פרוק, אז אקספט פרוק הינה לולה ואני רואה שלא עשינו פה ריג'נים, אה אין ריג'נים בסי פלאס פלאס, נכון מאוד יפה אזי אזי זוהי אקספט פרוק אז השאלה היא איך עובד באמת האקספט פרוק איפה יש לו בכלל את הלולה אז הנה היא הלולאה אז הוא עשה אקספט קודם כל כדאי להדפיס אחרי שהוא עושה אקספט כדאי להדפיס אבל לא רוצה

  5. 02:12

    לעשות שינויים אז אני ארשום אני ארשום לעצמי דברים שאני רוצה לשנות אז בשורה 148 של הסרוור אני רוצה להוסיף הדפסה אחרי אקספט.

  6. 02:28

    אז הכבר אם אני new ו-text document ו-add print, זה הוא printf, אחרי אקספט, אקספט, ואני צריך לסמן שזה בסרוור, in server, שורה איזה? 148?

  7. 02:50

    את לא זוכרת. 148 in server line 148 add printf after accept נקודה שמור go יפה אבל בואו ונניח שזה עבר בשלום אז הוא עושה for ומחפש ככה וככה ומוצא אז גם זה כדאי להגיד שהוא מצא והוא מאחסן אז בשורה 158 אוסף הדפסה שהוא מעקסם אז line 158 add printf client tools ואולי גם את ה-id שלו יפה כל זה

  8. 03:33

    בסרוור זה בעצם בכותרת insert server insert server נעשה את זה עם שווה אם ככה יפה מאוד יפה מאוד הלאה בואו נניח שגם זה עבר בשבילנו הוא פתח קליינט פרוק אגב אם זה ברייק הוא יצא מהפור והוא חוזר לווייל אבל הוא לא מצפיץ שהוא רגע מה קורה אם הוא לא מוצא זאת אומרת הוא עבר על כולם והוא לא מוצא מקום קליינט אם הוא אינוואליד אז הוא מאחסן ויוצר וברייק

  9. 04:44

    מהחיפוש יפה אבל מה קורה אם הוא עובר על הכל ולא מוצא אז איך נדע אם הוא לא מצא לא נדע אם לא נשים פה פלאג זו האפשרות הראשונה, האפשרות השנייה זה אם int i הוא מוכר כאן בחוץ, השאלה היא האם int i מוכר פה בחוץ, i, האם הוא מכיר את i, קונטרול רווח, פעם שעברה הוא היה עם i, נראה שהוא מכיר את i, אז בגרסאות קודמות של c++ הוא הכיר את i גם מחוץ ללולאה, שלא כמו ב-c-sharp

  10. 05:27

    ש-i לא מוכלת מחוץ ללולאה כי העיגון אומר שזה היה בלוק, אז int i הוגדרה מחוץ לבלוק, אז היא אמורה להיות מוכרת אחרי הבלוק.

  11. 05:39

    אבל בגרסה האחרונה של c++ הם אמרו לא, שה-int i יחדל להיות קיים אחרי הבלוק. אז אני לא יודע איך זה הולך לעבוד פה, בואו נגיד שזה יעבוד.

  12. 05:52

    אז אם i שווה ל-size, אז זה לא נמצא. אה, סליחה, אני לא רוצה לכתוב אבל, כי אז הוא לא ייתן לי. אז שורה 162 ללבדוק inline line 162 add if i שווה לסייז printf no more space יפה מאוד אבל לעת עתה לא נעשה ולא כלום נניח שזה עבר בשלום נלך לקליינט פרוק גו דפינישן אנחנו באים לקליינט

  13. 06:54

    פרוק ואנחנו מניחים שגם זה דבר בשלום אז וואלה אל טרו בקיצור הוא אמור היה להדפיס בואו נשים אני כרגע אני מניח שהוא ברסיב אז אני אשים כאן זהו פה יש לנו הדפסות אז אם הוא היה מגיע רצוי בתחילה של סרט גם לשים הדפסה, אז בשורה 47, line 47,

  14. 07:32

    ב-beginning of client proc, in the beginning of client proc, add printf, initializing ID. הוא אמור לדעת את ה-ID, שידפיס, אני מאחל את זה, פה הוא לא אומר כלום.

  15. 08:08

    יפה פה נראה מה קורה אם אני אכתוב פה 333 enter כן הוא לא מגיע אם היה מגיע אליה הוא היה מדפיס משהו אז הוא לא מגיע שאלה אם הוא בכלל יש לו שרד שרד אני יכול לבדוק בעזרת break ו...

  16. 08:25

    שרד לפרוט את הפירק to be deadlocked or is not running any zoom mode code or thread has been stopped זה טוב יופי אין אקספט טרוק וקליינט טרוק אהה רק אחד זה קליינט אבל השרד השני לא נוצר נכון?

  17. 08:45

    ה-thread הראשון, ה-thread הראשון, הנה הוא. הוא נמצא כאילו כאן. למעשה, נו דה דה דה דה קולסטראנק. הוא נמצא למעשה, הוא למעשה נמצא כאן. ה-thread הראשון נמצא במיין בגט שער.

  18. 09:11

    ה-error list לא מעניין בזמן הנמצא, וזה לא מעניין. יפה. וה-accept proc, יפה, נמצא ב-accept. זה צודק. קליינט פרוק נמצא ברסיף, אבל יש רק אחד, אמורים להיות שניים.

  19. 09:34

    מתי הוא מייצר את הקליינט פרוק? כשהאקספט חוזרת, אז הוא מייצר את הקליינט פרוק. כן, מה שעבר אני חושב זה שיש פה name, אנחנו יכולים ל...

  20. 09:50

    זה ה-name, אם אין לו שם, אז הוא מציג את השם של הפונקציה. אתה רואה, למיינדסלד הוא קורא מיינדסלד, נורא נחמד. אנחנו גם יכולים לתת להם שמות, כי אמורים להיות כמה קליינטים, אז הייתי רוצה לראות את ה-ID שלו, למרות שאני יכול תמיד לגשת אליו, לגשת ל-contact ולראות מה ה-id שלו.

  21. 10:11

    אז זה יכול להיות נחמד להוסיף לו שם של ה-thread, זה גם טוב בשבילכם לראות איך עושים את זה, וזה ישבור קצת את השגרה. Client proc, אז ב-initialization של ה-client proc לשנות את ה-thread name.

  22. 10:32

    line, איזה שורה זה? ערך 48 48 in client proc add name id נקרא להם קוראים לו הם נותנים לו שם client proc כשם הפונקציה וזה מיותר כי רואים את הlocation פה אלא אם כן נכנס יותר עמוק אבל אצלנו לא נכנס יותר עמוק מזה אז נציג לקרוא לו id אבל אפשר גם לקרוא לו client id יפה מאוד טוב אז אין לו פה אין לו thread, זה נורא מוזר, בהחלט נורא

  23. 11:21

    מוזר. בואו נראה למה אין לו thread. האמת שאותו אני אהרוג ואני אגש ל-accept proc ונשים פה breakpoint. בואו נראה מה קורה כש-thread חדש, כן, את זה עצרנו אז אני יכול להריץ את זה שוב, פשוט נריץ.

  24. 11:45

    את ה-server גם נריץ כי כרגע הוא תקוע, עצרנו אותו ב-break אז נשחרר אותו, ניתן לו לרוץ ומיד הוא מגיע. אז קליינט בוא נראה מה הסיפור שלו אז הוא לא אינטווליט והדבר הבא שהוא הולך לאתר זה מקום במערך של הקליינט בוא נראה שיש מקום יש לו שני מקומות מעולה אבל זה אפסים הוא מחפש אינטווליט סוקס הוא לא ימצא אינטווליט אז איך את הראשון הוא

  25. 12:19

    דחה זה נורא מוזר בעיניי חוץ מזה שהוא לא מפנה מקום אחרי שהוא מסיים ברגע שהוא מת ברגע שהוא מגיע לכאן הוא צריך לנקות, הייתי אומר פאבליש פה קליינט דיסקונקטד קליינט אין ואליד סוקרט כן אבל הוא צריך להוציא את עצמו מתוך הקליינט זה בסדר הכל טוב לדעתי דבר ראשון הוא צריך לצאת מהקליינט אופס

  26. 12:58

    אני שוב אשנה את זה אז בשורה 69 client 69 remove client from client טוב אז זהו אבל זה לא כזה חשוב כרגע מה שחשוב כרגע זה לראות איך הוא מגיב לניסיון התחברות אז שמנו breakpoint ctrl+b b1 receive זה נחמד אבל זה לא מעניין בשלב הזה ו-B1 יופי זה כבר לא מעניין בשלב זה יופי בואו נמשיך הנה אז אנחנו כבר יודעים את הבעיה אז

  27. 13:52

    עכשיו לא מובן איך זה בכלל עבד איך הראשון עבד אז באמת צריך להתחיל את כל המערכת מחדש ומה שיותר מעניין זה להגיע לברק פוינט הזה בפעם הראשונה אז בתחום של קליינט קליינט איפה הם קליינט הנה קליינט שווה עם ויצוגת יפה מאוד יפה מאוד, יפה מאוד, כל הכבוד, כל הכבוד.

  28. 14:29

    יפה, אז למדנו משהו שאתחול של שדה אחד במערך מאתחל רק את השדה ומאפס את יתרתו. מה אני יכול לעשות? מה שאני יכול זה, אני יכול, על הכל אני יכול, אבל אחד מהדברים זה קופי חצי ימינה פסיק ונשים את זה כאן.

  29. 14:52

    ונשים עוד אחד ועוד אחד וזה, אין לזה צורה. מה שאנחנו צריכים זה לולאה,

לקורס המלא: קורס C למתקדמים אונליין

ההרצאה הקודמת: בניית חדר דיונים

ההרצאה הבאה: הרצת שרת ושני לקוחות במקביל

הרצאות קשורות מקורסים אחרים

  • תיקון תנועת המצלמה
  • פתרון תקלות ב-iSCSI
  • הגדרת RunLevel בשרת
  • חידושים בשרת Hyper-V

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס תכנות מתקדם - #Advanced .NET C