11.1 סוקטים תרגול
תרגול - סוקטים - sockets¶
תרגול 1 - לקוח TCP בסיסי¶
- כתבו תוכנית לקוח TCP שמתחברת לשרת בכתובת ופורט שמתקבלים כארגומנטים משורת הפקודה.
- אחרי החיבור, התוכנית קוראת שורות מ-stdin ושולחת כל שורה לשרת.
- אחרי כל שליחה, התוכנית מחכה לתשובה מהשרת ומדפיסה אותה.
- כשהמשתמש מקליד "quit", התוכנית סוגרת את הסוקט ויוצאת.
לבדיקה, הריצו שרת הד עם nc -l 8080 בטרמינל אחר.
רמז: השתמשו ב-
fgetsלקריאה מ-stdin וב-write/readלתקשורת עם השרת.
תרגול 2 - שרת הד משופר¶
- כתבו שרת TCP שמאזין על פורט שמתקבל כארגומנט.
- השרת מקבל חיבור, קורא נתונים מהלקוח, ושולח אותם בחזרה (echo) עם תוספת: לפני כל הודעה הוא מוסיף את הprefix
[ECHO]. - השרת מדפיס לconsole את כתובת הIP והפורט של כל לקוח שמתחבר.
- כשלקוח מתנתק, השרת חוזר לחכות ללקוח הבא.
- אל תשכחו להגדיר
SO_REUSEADDR.
רמז:
readמחזירה 0 כשהלקוח סגר את החיבור. השתמשו בזה כתנאי לצאת מלולאת הread.
תרגול 3 - שרת זמן - time server¶
- כתבו שרת TCP שמאזין על פורט 9999.
- כשלקוח מתחבר, השרת שולח לו את התאריך והשעה הנוכחיים כמחרוזת, ומיד סוגר את החיבור.
- השתמשו בפונקציות
timeו-ctime(אוstrftime) מ-<time.h>כדי לקבל את הזמן. - השרת ממשיך לרוץ ומטפל בלקוח הבא.
לבדיקה: nc 127.0.0.1 9999 - צריך לקבל את השעה ואז החיבור נסגר.
רמז:
time(NULL)מחזירה את הזמן הנוכחי,ctime(&t)ממירה אותו למחרוזת.
תרגול 4 - בדיקת פורטים - port scanner¶
- כתבו תוכנית שמקבלת כתובת IP ושני מספרי פורט (התחלה וסוף) כארגומנטים.
- התוכנית סורקת את כל הפורטים בטווח ומדפיסה אילו פורטים פתוחים.
- פורט פתוח =
connectהצליח. פורט סגור =connectנכשל. - לכל פורט, צרו סוקט חדש, נסו
connect, סגרו את הסוקט.
דוגמת הרצה:
רמז:
connectייכשל עם ECONNREFUSED אם הפורט סגור. שימו לב שזה יכול לקחת זמן כי כלconnectלפורט סגור עלול לחכות לtimeout.
תרגול 5 - הפניית קלט/פלט לסוקט¶
- כתבו שרת TCP שמאזין על פורט 4444.
- כשלקוח מתחבר, השרת עושה
fork. - בתהליך הילד: השתמשו ב-
dup2כדי להפנות את stdin, stdout, ו-stderr לסוקט של הלקוח, ואז הריצו/bin/shעםexecvp. - תהליך האב סוגר את ה-fd של הלקוח וחוזר ל-
accept.
לבדיקה: nc 127.0.0.1 4444 - תקבלו shell מרוחק.
אזהרה: תרגול זה ליצירת reverse shell למטרות לימוד בלבד. הריצו אותו רק על המכונה שלכם, על localhost.
רמז: חיזרו למה שלמדנו בפרק 5.5 על
dup2ובפרק 5.2 עלforkו-exec.