מידע רשת

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 - מספר הרשת, אותו מספר שלם כמו בצורת הקשר סקלר.

בכישלון חיפוש בהקשר רשימה, ההחזרה היא רשימה ריקה.

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

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

דוגמאות#

צורת סקלר - חיפוש רשת נקובה והדפסתה כ־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/networks are traditionally stored as the network portion only

    • 127 for loopback, 10 for 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 - המקבילה ברמת המארח, לפתרון שם מארח לכתובת IP

  • Net::netent - עטיפת עצם לפי־שם המחזירה מתודות accessor במקום רשימה מיקומית