לדלג לתוכן

11.1 סוקטים תרגול

תרגול - סוקטים - sockets

תרגול 1 - לקוח TCP בסיסי

  1. כתבו תוכנית לקוח TCP שמתחברת לשרת בכתובת ופורט שמתקבלים כארגומנטים משורת הפקודה.
  2. אחרי החיבור, התוכנית קוראת שורות מ-stdin ושולחת כל שורה לשרת.
  3. אחרי כל שליחה, התוכנית מחכה לתשובה מהשרת ומדפיסה אותה.
  4. כשהמשתמש מקליד "quit", התוכנית סוגרת את הסוקט ויוצאת.

לבדיקה, הריצו שרת הד עם nc -l 8080 בטרמינל אחר.

רמז: השתמשו ב-fgets לקריאה מ-stdin וב-write/read לתקשורת עם השרת.


תרגול 2 - שרת הד משופר

  1. כתבו שרת TCP שמאזין על פורט שמתקבל כארגומנט.
  2. השרת מקבל חיבור, קורא נתונים מהלקוח, ושולח אותם בחזרה (echo) עם תוספת: לפני כל הודעה הוא מוסיף את הprefix [ECHO].
  3. השרת מדפיס לconsole את כתובת הIP והפורט של כל לקוח שמתחבר.
  4. כשלקוח מתנתק, השרת חוזר לחכות ללקוח הבא.
  5. אל תשכחו להגדיר SO_REUSEADDR.

רמז: read מחזירה 0 כשהלקוח סגר את החיבור. השתמשו בזה כתנאי לצאת מלולאת הread.


תרגול 3 - שרת זמן - time server

  1. כתבו שרת TCP שמאזין על פורט 9999.
  2. כשלקוח מתחבר, השרת שולח לו את התאריך והשעה הנוכחיים כמחרוזת, ומיד סוגר את החיבור.
  3. השתמשו בפונקציות time ו-ctime (או strftime) מ-<time.h> כדי לקבל את הזמן.
  4. השרת ממשיך לרוץ ומטפל בלקוח הבא.

לבדיקה: nc 127.0.0.1 9999 - צריך לקבל את השעה ואז החיבור נסגר.

רמז: time(NULL) מחזירה את הזמן הנוכחי, ctime(&t) ממירה אותו למחרוזת.


תרגול 4 - בדיקת פורטים - port scanner

  1. כתבו תוכנית שמקבלת כתובת IP ושני מספרי פורט (התחלה וסוף) כארגומנטים.
  2. התוכנית סורקת את כל הפורטים בטווח ומדפיסה אילו פורטים פתוחים.
  3. פורט פתוח = connect הצליח. פורט סגור = connect נכשל.
  4. לכל פורט, צרו סוקט חדש, נסו connect, סגרו את הסוקט.

דוגמת הרצה:

./portscan 127.0.0.1 1 1024
port 22 - open
port 80 - open
port 443 - open

רמז: connect ייכשל עם ECONNREFUSED אם הפורט סגור. שימו לב שזה יכול לקחת זמן כי כל connect לפורט סגור עלול לחכות לtimeout.


תרגול 5 - הפניית קלט/פלט לסוקט

  1. כתבו שרת TCP שמאזין על פורט 4444.
  2. כשלקוח מתחבר, השרת עושה fork.
  3. בתהליך הילד: השתמשו ב-dup2 כדי להפנות את stdin, stdout, ו-stderr לסוקט של הלקוח, ואז הריצו /bin/sh עם execvp.
  4. תהליך האב סוגר את ה-fd של הלקוח וחוזר ל-accept.

לבדיקה: nc 127.0.0.1 4444 - תקבלו shell מרוחק.

אזהרה: תרגול זה ליצירת reverse shell למטרות לימוד בלבד. הריצו אותו רק על המכונה שלכם, על localhost.

רמז: חיזרו למה שלמדנו בפרק 5.5 על dup2 ובפרק 5.2 על fork ו-exec.