סוקטים בפרל

בכתבה זו יהיו הסברים על:
מה זה סוקט?
שימוש בסוקטים בפרל
ו
תוכניות דוגמא

נתחיל מ:

=========
מה זה סוקט?
=========

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

אז עכשיו, החלק הבא הוא:

===============
איך עושים את זה בפרל?
===============

בפרל, כדי להקל עלינו, קיים המודול
IO::Socket
שיוצר ממשק פשוט לשימוש בסוקטים בעזרת אובייקטים.
לכן, בתוכנית שאתם רוצים שימוש בסוקט תופיע השורה הבאה איפשהו בהתחלה:
use IO::Socket;
עכשיו, כדי ליצור חיבור חדש, יוצרים אובייקט שהוא סוקט:
my $so = new IO::Socket::INET (
key => value,
key => value,
);

כמו שאפשר לראות, ביצירת האובייקט(הפקודה new), אנחנו
נותנים לו רשימה של מפתחות וערכים שלהם - טבלת האש, או מערך אסוציאטיבי כמו שפעם קראו לו.
המפתחות האלה קובעים לאן להתחבר, באיזה פורט ואפשרויות נוספות.
הנה תוכנית דוגמא שמתחברת ליאהו:
#!/usr/bin/perl
use IO::Socket;

my $so = new IO::Socket::INET (
PeerAddr => 'www.yahoo.com',
PeerPort => 80,
Proto => 'tcp',
);
die "Can not connect: $!" unless $so;

כאן יש לנו את הפרמטרים, שאמורים להיות מובנים:

PeerAddr - כתובת השרת שאליו מתחברים
PeerPort - הפורט שדרכו מתחברים
Proto - הפרוטוקול שבעזרתו מועבר המידע(tcp, udp ועוד)
וגם נוסף התנאי שאם החבור לא מצליח מסיבה כלשהיא, מוצגת הסיבה והתוכנית יוצאת.
כדי לכתוב לתוך סוקט, משתמשים בפקודה print, כמו שכותבים לקובץ:
#!/usr/bin/perl
use IO::Socket;

my $so = new IO::Socket::INET (
PeerAddr => 'www.yahoo.com',
PeerPort => 80,
Proto => 'tcp',
);
die "Can not connect: $!" unless $so;
print $so "GET / HTTP/1.0\r\n\r\n";
close($so);

כמו שאפשר לראות, ניתן להשתמש בפרינט כדי לשלוח מידע לסוקט
במקרה הזה נשלחת בקשת HTTP של GET לשרת
כמובן, הפקודות שונות לכל סוג שרת, ואני לא ארחיב על זה כאן
ובסוף, הפקודה close סוגרת את החיבור. בעצם, פרל עושה את זה לבד בשבילכם, אבל עדיף
להוסיף את השורה הזאת בכל מקרה כדי למנוע שגיאות ובעיות
עכשיו שלחנו את הבקשה(GET) לשרת, אנחנו צריכים לקלוט את המידע
שהשרת שולח אלינו. ברגע שנוצר חיבור, הסוקט משמש בצורה דומה לFilehandle
לכן ניתן להוסיף את השורות
#!/usr/bin/perl
use IO::Socket;

my $so = new IO::Socket::INET (
PeerAddr => 'www.yahoo.com',
PeerPort => 80,
Proto => 'tcp',
);
die "Can not connect: $!" unless $so;
print $so "GET / HTTP/1.0\r\n\r\n";
while ($in=<$so>) {
print $in;
}

close($so);
כל מי שיודע לעבוד עם קבצים בפרל יבין שהקוד שנוסף לוקח כל שורה מהסוקט
ומדפיסה, עד שהמידע לא נגמר, בדיוק כמו קריאה מקובץ.

עכשיו, השיטה שבעזרתה קלטנו את המידע היא מצויינת בשביל התחברות לשרת
אבל מה אם אנחנו צריכים ליצור שרת, שיחכה להתחברות?
פה, יש לנו שימוש בפרמטרים נוספים:
#!/usr/bin/perl
use IO::Socket;

my $so = new IO::Socket::INET (
LocalAddr='localhost',
LocalPort=7845,
Proto => 'tcp',
Listen => 1,
Reuse => 1,
);

כאן השתנו לא מעט דברים, להתחלה PeerAddr וPort השתנו
הפרמטר localaddr - קובע את הכתובת/שם של השרת שלנו. ברוב הפעמים שתצטרכו שרת "ביתי
אתם יכולים לשים 'localhost', או פשוט להשמיט את הפרמטר כולו
localport - די מובן מאליו, הפורט שיפתח ויחכה לחיבור. לפורט הזה יצטרך להתחבר הלקוח.
Proto - הפרוטוקול כמובן, בדיוק כמו קודם
Listen - הפרמטר הזה מסמל את מספר החיבורים שיכולים להיות בתור של הסוקט להתחברות. כאן אנחנו מקבלים רק חיבור אחד
יותר מזה, כל חיבור שינסה יקבל שגיאה.
reuse - הפרמטר הזה מאפשר לנו שהתמש באותו פורט שוב אחרי שהתוכנית יוצאת. זה על מנת להבטיח שניתן יהיה שימוש בפורט
אפילו במקרה של שגיאה קריטית בתוכנית שלנו.
עכשיו, כדי להתחיל לחכות לחיבור ולקבל נתונים, יש להשתמש בשיטה accept
#!/usr/bin/perl
use IO::Socket;

my $so = new IO::Socket::INET (
LocalAddr='localhost',
LocalPort=7845,
Proto => 'tcp',
Listen => 1,
Reuse => 1,
);
$client = $so->accept();
while (defined($message = <$client>)) {
print $message;
}
close ($so);

מה שעשינו כאן זה שימוש בשיטה accept() כדי להחזיר סוקט חדש שדרכו אנחנו יכולים להתחיל לקבל מידע
אתם בטח נורא מאושרים, אבל תתאפקו עוד קצת :)
ה$client הוא בעצם הלקוח המתחבר אלינו, ובלולאה פשוטה אנחנו קולטים ממנו מידע ומדפיסים על המסך,
כמו קריאה מקובץ. אחרי שאין יותר מידע לקבל, הוא יוצא מהלולאה וסוגר את הסוקט.

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

==========
תוכניות דוגמא
==========

תשנו את הסיומות לpl כדי להריץ(דההה:))

header
סקריפט שמזזיף(spoofing) האדרים של HTTP כמו refferer, useragent ועוד.

RCY-Server, RCY-Client
תוכנת שרת פשוטה שקולטת פקודות, מנתחת אותם ומבצעת פעולות בהתאם + תוכנת לקוח במיוחד בשבילה

----------------------

זהו, עד כאן עם הטקסט, תהנו
Cypher.