PracticU

צד שרת

בלי כתוביותעם כתוביות
PracticU › קורס C למתקדמים - עבודה מול חומרה Win32 › צד שרת
מילון מושגים:
צד שרת - החלק של היישום שרץ בשרת ואחראי על הלוגיקה, מסדי הנתונים והעיבוד שמאחורי הקלעים.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
כתובת IP - מספר שמזהה באופן ייחודי מכשיר ברשת מבוססת פרוטוקול IP, ומאפשר לשלוח אליו ולקבל ממנו מידע.
פורט - מספר שמזהה שירות או תהליך מסוים בתוך מחשב, ומאפשר לכוון תעבורת רשת ליעד הנכון. למשל פורט 80 ל-HTTP.
בייט - יחידת מידע המורכבת משמונה ביטים, ומסוגלת לייצג תו בודד או מספר בין 0 ל-255.
אופרטור - סימן בקוד שמבצע פעולה על ערכים, כמו חיבור, השוואה או פעולה לוגית.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.
TCP - פרוטוקול תקשורת אמין שמוודא שכל חבילות המידע מגיעות ליעד בשלמות ובסדר הנכון.

צד שרת
צד השרת בהרצאה הזו הוא המשך ישיר להרצאה על צד הלקוח. קודם מחברים את הלקוח לשרת מקומי ברשת, ואחר כך כותבים תוכנית שרת שמקשיבה לחיבורים. ההרצאה כוללת גם חלקים ארוכים של בדיקת שגיאות וניהול זיכרון.
השלבים העיקריים
1. בדיקת הלקוח: לפני כתיבת השרת מריצים את הקוד של הלקוח מול שרת מקומי. הקוד משתמש ב-getaddrinfo כדי לקבוע את פרטי הכתובת, ב-socket ליצירת סוקט, וב-connect להתחברות. המרצה מדגיש שהכתובת שמעבירים ל-connect צריכה להיות כתובת שהוחזרה מהפונקציה הקודמת, ולא ערך שהומר בצורה שגויה.
2. פרויקט שרת נפרד: נפתח פרויקט קונסולה חדש בשם Server, שבו הקוד נכתב מאפס.
3. כתובת השרת: שרת לא צריך לדעת את כתובת ה-IP של עצמו בשם, ולכן משתמשים שוב ב-getaddrinfo, הפעם כדי לקבוע את הכתובת והפורט שבהם השרת יאזין.
4. יצירת סוקט לשרת: הסוקט נוצר לפי התוצאה של הפונקציה הקודמת, ואז הקריאה ל-bind קושרת אותו לכרטיס הרשת ולפורט.
5. האזנה וקבלה: listen אומרת לסוקט להמתין להתחברויות, ו-accept מחזירה סוקט חדש לכל לקוח שהתחבר. התקשורת עם הלקוח נעשית על הסוקט החדש, והסוקט הראשון ממשיך להקשיב.
6. קבלה ושליחה: הקוד לקבלה ולשליחה דומה למה שנכתב בצד הלקוח.
7. אתחול Winsock: לפני הקריאות לפונקציות הרשת צריך לקרוא ל-WSAStartup, שמקבלת מבנה WSADATA ומספר גרסה. המרצה מראה שאת גרסה 2.2 בונים בעזרת מאקרו שמזיז את הבייט העליון ומחבר אותו לבייט התחתון, והתוצאה היא 514. בסיום קוראים ל-WSACleanup.
8. בדיקת שגיאות: כשפונקציה נכשלת, WSAGetLastError מחזירה את קוד השגיאה. המרצה קורא ב-MSDN שהפונקציה מחזירה ערך שונה מאפס כשיש כשל, ושיש רשימה מסודרת של קודי שגיאה.
טעויות נפוצות
- מאקרו שלא מוקף בסוגריים מתפרש לפי סדר הקדימויות של האופרטורים. בדוגמה, פעולת ההזזה הופעלה לפני ה-OR וגרמה לתוצאה שגויה, עד שהוספו סוגריים.
- שחרור משאבים חשוב גם כשהתוכנית מסתיימת. אם הפונקציה תיקרא שוב ושוב, כל הקצאה שלא שוחררה תישאר בזיכרון. המרצה מזכיר שכך בודקים יציבות של קוד שמיועד להפוך ל-DLL.
- ערך שחוזר מפונקציה צריך להיבדק לפי התיעוד, ואין לסמוך על הנחה כללית.
בסיום ההרצאה ברור איך בונים שרת TCP פשוט שמאזין ומקבל חיבורים, ואיך מאתחלים את Winsock ומטפלים בשגיאות. המרצה מציין שישלים את צד הלקוח בהרצאה הבאה.
השיעור הבא בקורס: בניית חדר דיונים

פרקי ההרצאה: צד שרת

  1. 00:00

    חיבור לשרת עם Winsock: getaddrinfo

  2. 00:49

    איפוס מבנה התוצאות לפני החיבור

  3. 02:31

    דוגמאות מהתיעוד: Client ו-Connect

  4. 03:12

    העברת מצביע התוצאות ל-connect

  5. 06:20

    החיבור לשרת מצליח והודעה נשלחת

  6. 07:05

    בניית שרת משלנו בפרויקט נפרד

  7. 10:54

    יצירת סוקט לשרת לפי התיעוד

  8. 11:48

    bind, listen ו-accept לחיבורים נכנסים

תמלול ההרצאה: צד שרת

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

  1. 00:03

    טוב בואו נמשיך אז אנחנו מנסים להתחבר לשבץ בברק אז בואו בברק אז בואו נסגור רק את זה זה מיותר וגם זה מיותר וגם זה מיותר ובואו נראה מה קורה כאן אז make word זה start up זה get address info זה הצליח השאלה היא מה הוא מקבל בתור address info אם זה משהו שקשור למשהו שאנחנו מכירים אדרס דאטה 35, כן אני לא יודע מה זה הדברים האלה בכלל

  2. 00:49

    מה זה 35, מה זה סולמית, דברים נורא מוזרים זה בידיעה שאיפסנו קודם את ריזנט, איפה ריזנט? את ריזנט, הנה התחלנו את הפוינטר, זאת אומרת הם חיזמו את זה למשהו, הם החזירו את זה למשהו ונראה שהם פמילי 2, סופי טייפ 0, נראה מוזר ויצירה של הסוקט, כבר לא invalid socket כמו שזה היה בהתחלה, יופי, מה זה invalid?

  3. 01:32

    invalid socket זה מינוס אחד, נכון? מינוס אחד, כן, ו-socket address ו-connect, והוא נכשל, הוא לא מצליח להתחבר, ssa, מה זה ssa? בואו נראה ssa, סוקט מעליי, תואר מעל קונקט, אה, סוקט אדרס, שאלה מאופת מה יש בסוקרט אדרס אחרי זה השאלה היא סוקרט אדרס צריך למלא אותו בערכים זה לא הגיוני ככה

  4. 02:14

    בואו נעשה F1 ונמתין יפה בואו ניתן לו גם סינק לא שאנחנו צריכים את זה קונקט פונקשן יופי אבל מה שאני רוצה זה את רצף הדוגמאות שלהם רצף הדוגמאות ב-Using Getting Started Client Creating זה ה-Address וזה היתרה של ה-Socket וזה ה-Connect ה-Connect אוקיי אז הוא צריך את ה-PTR,

  5. 02:56

    Address ו-Lan זה ה-Connect מה אנחנו נתנו ל-Connect? ל-Connect נתנו Socket Address, Socket Address ו-Name Lan והם נתנו את PTR AI Address הם לא יעשו זה לא נכון לא צריך את זה מה שצריך לשים פה זה את ריזלט את הכתובת של ריזלט ריזלט הוא פוינטר ואדר וכאן את ריזלט ואת נימלן אדרלן אדרלן אבל זה קאסטד לאינס וזה בלי קאסטינג אה אבל

  6. 03:48

    לא צריך אדר אז לא צריך כתובת של לא צריך כתובת של למה כי עד בעצמו F12 הוא פוינטר בעצמו למה? לסטראק.

  7. 04:06

    מה זה כל זה? מה זה F12? הלאוד F12 זה הדבר הזה. Definition to force a compile error when macros are used improperly relies on visuals to perfect source annotations.

  8. 04:30

    מה זה? אם אני אעשה F12 אז אין לו מה להגיד. זה כבר מעבר ל... אני יודע שהוא מצרף אם יש לו את P הוא פשוט מצרף את אלאוד כף תחתון ל-P אצלנו P זה AI אדרלן אז AI אדרלן מצורף לאלאוד עם דולר עם כף תחתון כף תחתון אני לא יודע מה זה אומר בכל מקרה זה כבר פוינטר לסטראקט סוק אדר אף 12 סוק אדר זה שני השדות האלה בסדר גמור טוב אז אם אני מנסה להחזיר אותו הוא יזעק

  9. 05:28

    אז בואו נגיד לו התחל מחדש נחכה לו יופי יש שגיאות לינקר הוא אומר check for insufficient disk space invalid path for insufficient privilege כמו שה pdb writing to program database קובץ pdb בואו נעשה להגיד לו ריבילד נראה אם זה יעזור אם לא נעשה את הוויז'ול סטודיו מחדש אבל בילד סקסידר זה בסדר אז בואו נגרר את זה קצת יש בריק פוינט

  10. 06:10

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

  11. 06:38

    הוא לא מראה לי אותו, למה? בוא נגיד לו add watch, not found, הוא כבר משום מה כאילו ויצא החוצה, זה שורה מיותרת.

  12. 06:55

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

  13. 07:08

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

  14. 07:19

    New project. ובואו נצמצם כדי שזה יהיה ברור. Other languages, visual C++, מי 32, Console Application, וזה יהיה הסרבר 01.

  15. 07:33

    הניסיון הראשון לכתוב סרבר, בואו נגיד לו אוקיי. וכמובן נגיד לו שהוא נקי, נקי. אין בו ולא כלום שום דבר console application טהור בלי כלום יפה ועכבר ימני add new item וזה יהיה c++ ונקרא לו main ונגיד לו add יפה אז בואו נתחיל אז דבר ראשון זה void main פתח סגור פתח סגור עכבר ימני ובילד

  16. 08:20

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

  17. 09:01

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

  18. 09:23

    למה זה? כי פתחתי את ה-MSDN מתוך ה-Visual Studio. ה-MSDN נולד מ-F1. נורא מוזר. בואו נסגור גם אותו, ונפתח Visual Studio, ו-Networking 01, ו-double-click, enter, ו-enter, enter.

  19. 09:45

    מה שאני אבל רוצה זה את זה לשנות ל-client f2 client01 ונראה לי שזהו בואו נראה איך זה נראה הנה פה במסלניס נמצאים הקבצים ברקורדינג networking networking01 זה ה-sln אבל יש פה תיקייה שנקראת networking01 והיא מכילה את networking01 project זה לא מבחינת מערכת הקבצים זה לא השתנה לא בסדר שיהיה ככה טוב אז סרבר אז בואו נעשה בואו נכתוב קונקט

  20. 10:41

    ואף אחד יפה וסינק וצמצם צמצם יוזינג גטינג זה היה קליינט ועכשיו הסרבר אז creating a socket for the server אוקיי אז איך בונים סרבר בואו נראה מה הם אומרים פה Creating a socket for the server.

  21. 11:09

    After initialization, a socket object must be instantiated for use by the server. To create a socket for the server. The get-adder-info function is used to determine the values in the sock-addr structure.

  22. 11:24

    מה זה אומר? port addr info זה נראה די דומה. כן, הם די דומים. get addr info. Resolve the local address and port to be used by the server.

  23. 11:37

    סרבר צריך לברר בעצמו מה ה-IP שלו. הוא יודע את השם של עצמו, הוא לא יודע את ה-IP של עצמו. אוקיי.

  24. 11:46

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

  25. 12:09

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

  26. 12:31

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

  27. 12:54

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

  28. 13:12

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

  29. 13:42

    שלנו ב-Client שכתבנו התנתקות אמורות להיות שתי התנתקויות אחת עבור ה-Client Socket אבל השנייה עבור ה-Connect Socket שני סוקטים שדי לא קשורים אחד לשני זאת אומרת אני יכול לסגור את הסוקט את ה-Connect רק סוקט כדי לא להקשיב יותר להתחברויות אבל עדיין הסוקט הזה ימשיך לתפקד אין שום קשר ביניהם לדעתי

  30. 14:17

    וזה ה-complete client and server code יפה אז בואו נראה creating a socket for קודם כל צריך ליצור סוקט יצירת סוקט זה על ידי קריאה לפונקציה סוקט סוקט יוצרת לנו סוקט ובסוקט צריך להעביר את ה-result שהחזיר לנו גט אדר אינפו אז דבר ראשון זה גט אדר אינפו אז בוא נקרא גט אדר אינפו נכון קונטרול רווח וזה לא עושים כלום אז בואו נוסיף כמה דברים

  31. 14:57

    אז אינקלוד איזה יש אני חושב

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

ההרצאה הקודמת: צד לקוח

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

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

  • מה זה שרת ?
  • שרת APACHE - חלק 1
  • שרת Syslog
  • התקנת שרת 2022 DC

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

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