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.
מצב גלובלי שהוא נוגע בו#
דוגמאות#
חיפוש רשת הלולאה החוזרת לפי מספרה השלם:
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- עטיפה לפי־שם שמחזירה עצם עם accessorsname/aliases/addrtype/net