getnetbyname#
מחפש רשומת רשת לפי שם.
getnetbyname פותר שם רשת סימבולי (כפי שמופיע במסד הרשתות של המערכת, בדרך־כלל /etc/networks) לכתובת הרשת המספרית שלו על־ידי קריאה לשגרת ה־C getnetbyname(3). הצורה בהקשר סקלר מחזירה את מספר הרשת; הצורה בהקשר רשימה חושפת את הרשומה המלאה: שם קנוני, כינויים, משפחת כתובות, ומספר רשת.
תקציר#
my $net = getnetbyname $name;
my ($name, $aliases, $addrtype, $net) = getnetbyname $name;
מה מקבלים בחזרה#
הקשר סקלר - מספר הרשת כמספר שלם פשוט, או undef אם השם לא נמצא במסד הרשתות. זהו חלק הרשת של כתובת IPv4 בסדר הבתים של המארח, לא מחרוזת ארוזה. עבור רשת class-C 192.168.0, הערך המוחזר הוא 12625920 (כלומר, 0xC0A800).
הקשר רשימה - רשימה בת ארבעה אלמנטים המשקפת את struct netent של C:
$name- שם הרשת הקנוני.$aliases- מחרוזת מופרדת ברווחים של שמות חלופיים.$addrtype- משפחת הכתובות, בדרך־כללAF_INET(2).$net- מספר הרשת, אותו מספר שלם כמו בצורת הקשר סקלר.
בכישלון חיפוש בהקשר רשימה, ההחזרה היא רשימה ריקה.
מצב גלובלי שהוא נוגע בו#
דוגמאות#
צורת סקלר - חיפוש רשת נקובה והדפסתה כ־dotted-quad:
my $net = getnetbyname("loopback");
defined $net or die "no networks entry for loopback";
printf "%d.%d.%d.%d\n",
($net >> 24) & 0xFF, ($net >> 16) & 0xFF,
($net >> 8) & 0xFF, $net & 0xFF; # 127.0.0.0
צורת רשימה - כל שדה של הרשומה:
my ($name, $aliases, $type, $net) = getnetbyname("loopback");
print "name=$name aliases=$aliases type=$type net=$net\n";
נסיעה חזור כנגד getnetbyaddr - שם למספר, אחר־כך מספר חזרה לשם:
use Socket qw(AF_INET);
my $net = getnetbyname("loopback");
my $back = getnetbyaddr($net, AF_INET);
print "$back\n"; # loopback
ממשק לפי־שם דרך עקיפת Net::netent - מתודות accessor במקום פירוק מיקומי:
use Net::netent;
my $n = getnetbyname("loopback");
print $n->name, " ", $n->net, "\n";
שמירה מפני רשומה חסרה - שם שאינו במסד מחזיר undef, לא אפס:
my $net = getnetbyname("no-such-network");
if (defined $net) {
print "found: $net\n";
} else {
print "not in /etc/networks\n";
}
מקרי קצה#
יש לבדוק
undef, לא שקריות. מספר רשת0הוא רשומה חוקית (אם גם לא רגילה); התייחסות לערך ההחזרה כבוליאני תקרא את המקרה הזה בטעות ככישלון. תמיד יש לבדוק עםdefined.המספר המוחזר הוא בסדר הבתים של המארח, לא מחרוזת ארוזה. בניגוד ל־
gethostbyname, שמחזיר כתובת ארוזה של ארבעה בתים,getnetbynameמחזיר מספר שלם פשוט. אין להעבירו ל־Socket::inet_ntoa- אותה פונקציה מצפה למחרוזת ארוזה ותפיק זבל ממספר שלם.הכינויים הם סקלר אחד, לא רשימה.
$aliasesבצורת הרשימה הוא מחרוזת יחידה מופרדת ברווחים. יש לפצל על רווחים אם נדרשת רשימה.Networks are typically class-boundary numbers. The entries in
/etc/networksare traditionally stored as the network portion only127for loopback,10for the private class-A, not full four-octet addresses. On modern CIDR-routed networks the utility of this database is limited; most deployments keep only a handful of legacy entries.
אין נפילה־חזרה ל־DNS. בניגוד ל־
gethostbyname, קריאה זו מתייעצת רק עם מסד הרשתות המקומי. אין מקבילה ל־DNS עבור שמות רשת.רשימה ריקה מול undef. הקשר סקלר מחזיר
undefבכישלון; הקשר רשימה מחזיר רשימה ריקה. השניים אינם חליפיים - קוד שנכתב להקשר אחד יתנהג בצורה לא תקינה בשני.בטיחות thread. שגרת ה־C הבסיסית מחזיקה מצב סטטי לכל־תהליך עבור סמן הרשתות. קריאות בו־זמניות ממספר thread-ים עלולות לשלב את התוצאות.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
getnetbyaddr- החיפוש ההפוך: מספר רשת → רשומת רשתgetnetent- איטרציה על כל רשומה במסד הרשתות במקום חיפוש שם בודדsetnetent- החזרת איטרטור הרשתות לאחור ובקרה אם הקובץ נשאר פתוח בין חיפושיםendnetent- סגירת מסד הרשתות לאחר איטרציהgethostbyname- המקבילה ברמת המארח, לפתרון שם מארח לכתובת IPNet::netent- עטיפת עצם לפי־שם המחזירה מתודות accessor במקום רשימה מיקומית