מידע רשת

getnetbyaddr#

חיפוש רשומת רשת לפי כתובת הרשת המספרית שלה.

getnetbyaddr ממיר מספר רשת מספרי ומשפחת כתובות לרשומת מסד נתוני רשת על־ידי קריאה לשגרת ה־C getnetbyaddr(3) של המערכת. זוהי הפעולה ההפוכה של getnetbyname והיא מתייעצת באותו מסד נתוני רשת של המערכת (בדרך כלל /etc/networks או backend של NSS). בהקשר סקלר היא מחזירה רק את שם הרשת הקנוני; בהקשר רשימה היא מחזירה את הרשומה המלאה.

תקציר#

my $name = getnetbyaddr $addr, $addrtype;
my ($name, $aliases, $addrtype, $net) = getnetbyaddr $addr, $addrtype;

מה מקבלים בחזרה#

הקשר סקלר - השם הקנוני של הרשת, או undef אם לא נמצאה רשומה תואמת.

הקשר רשימה - רשימה בת ארבעה אלמנטים המשקפת את ה־struct netent של C:

  • $name - שם הרשת הקנוני.

  • $aliases - מחרוזת של שמות חלופיים מופרדים ברווחים.

  • $addrtype - משפחת הכתובות של הרשומה, בדרך כלל AF_INET (2).

  • $net - מספר הרשת כמספר שלם חסר־סימן, בסדר בתי המארח.

בכישלון חיפוש בהקשר רשימה, ההחזרה היא הרשימה הריקה. אם הרשומה קיימת אך ריקה, ההחזרה היא ערך־אמת יחיד וחסר־משמעות לפי המוסכמה המשותפת של משפחת ה־get*.

ארגומנטים#

  • ADDR - מספר הרשת כ־מספר שלם בסדר בתי המארח, לא מחרוזת ארוזה. זוהי צורת המספר־השלם המקומית שמתקבלת חזרה מקריאה קודמת ל־getnetbyname, או שנבנית באמצעות Socket::inet_aton ולאחריו unpack("N", ...) כדי להמיר מסדר רשת לסדר מארח.

  • ADDRTYPE - משפחת הכתובות, כמעט תמיד AF_INET מהמודול Socket.

מצב גלובלי שהוא נוגע בו#

  • סמן האיטרציה של מסד נתוני הרשת המשותף עם getnetent, setnetent, ו־endnetent. קריאה ל־getnetbyaddr עלולה לאפס סמן שהושאר פתוח על־ידי getnetent.

  • $! - ערך ה־errno של C בכישלון, היכן שהפלטפורמה קובעת אותו. רוב חיפושי /etc/networks נכשלים בשקט בלי לגעת ב־errno, לכן יש להתייחס ל־undef כאות הכישלון העיקרי.

דוגמאות#

חיפוש רשת הלולאה החוזרת לפי מספרה השלם:

use Socket;
my $name = getnetbyaddr(127 << 24, AF_INET);
print "$name\n";                     # loopback

הקשר רשימה - הרשומה השלמה:

use Socket;
my ($name, $aliases, $type, $net)
    = getnetbyaddr(127 << 24, AF_INET);
printf "%s (net=%08x)\n", $name, $net;

נסיעה חזור ממחרוזת מנוקדת, באמצעות Socket:

use Socket;
my $packed = inet_aton("127.0.0.0");     # packed, network order
my $net    = unpack("N", $packed);        # integer, host order
my $name   = getnetbyaddr($net, AF_INET);

ממשק לפי־שם באמצעות עקיפת Net::netent - שיטות accessor במקום פירוק מיקומי:

use Net::netent;
my $n = getnetbyaddr(127 << 24, AF_INET);
print $n->name, "\n" if defined $n;

קדימה ואז הפוך - לפענח שם, ואז לחפש את הכתובת בחזרה:

use Socket;
my $net  = (getnetbyname("loopback"))[3];
my $back = getnetbyaddr($net, AF_INET);
print "$back\n";                          # loopback

מקרי קצה#

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

  • classful בלבד, ברוב המערכות. מסד הנתונים /etc/networks שבבסיס קודם ל־CIDR. הרשומות הן מספרי רשת classful (למשל 127, 10, 192.168), וקריאת המערכת אינה שימושית עבור תת־רשתות CIDR שרירותיות. לחישוב תת־רשתות מודרני יש להשתמש ב־Socket או במודול CPAN כמו NetAddr::IP.

  • /etc/networks ריק. הפצות Linux רבות שולחות /etc/networks כמעט ריק; יש לצפות שרוב החיפושים יחזירו undef על מארח כזה. זוהי עובדת תצורה, לא באג בקריאה.

  • רשומת מסד נתונים ריקה בהקשר רשימה. לפי הכלל המשותף של משפחת ה־get*, רשומה הקיימת אך ללא שדות מחזירה ערך־אמת יחיד וחסר־משמעות, לא את הרשימה בת חמשת האלמנטים. בפועל אף פלטפורמה אינה מייצרת רשומה כזו עבור רשתות; יש לבדוק עם defined וספירת אלמנטים אם אכפת.

  • ADDRTYPE שונה מ־AF_INET. ספריית ה־C מקבלת את הארגומנט אך אין לה התנהגות מוגדרת עבור משפחות שאינן Internet כאן. יש להעביר AF_INET אלא אם מערכת היעד מתעדת אחרת.

  • בטיחות thread. שגרת ה־C שבבסיס שומרת מצב סטטי לכל־תהליך עבור סמן הרשת. קריאות מקבילות ממספר threads עלולות לשלב תוצאות. היכן שהפלטפורמה מציעה getnetbyaddr_r, Perl מחליפה אותה אוטומטית.

  • קדימות אופרטור רשימה. כמו שאר משפחת ה־get*, getnetbyaddr מתפרסר כאופרטור רשימה. getnetbyaddr $n, AF_INET or die מקשר את ה־or die לכל רשימת הארגומנטים, וזה בדרך כלל מה שרוצים; יש להוסיף סוגריים בעת ספק.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • getnetbyname - החיפוש קדימה: שם קנוני או חלופי → רשומת רשת

  • getnetent - לעבור על כל רשומה במסד נתוני הרשת במקום לחפש כתובת אחת

  • setnetent - להחזיר את איטרטור הרשת לאחור ולשלוט האם מסד הנתונים נשאר פתוח בין חיפושים

  • endnetent - לסגור את מסד נתוני הרשת בסיום האיטרציה

  • gethostbyaddr - האנלוג ברמת המארח; מקבל כתובת ארוזה, לא מספר שלם

  • Net::netent - עטיפה לפי־שם שמחזירה עצם עם accessors name / aliases / addrtype / net