מידע רשת

getprotobynumber#

חיפוש רשומת פרוטוקול רשת לפי מספר הפרוטוקול שהוקצה לה.

getprotobynumber עוטף את קריאת המערכת getprotobynumber(3). בהינתן מזהה פרוטוקול מספרי - אותם ערכים שמיוצגים על־ידי קבועים כמו IPPROTO_TCP (6), IPPROTO_UDP (17), IPPROTO_ICMP (1) - הוא מחזיר את הרשומה המתאימה ממסד נתוני הפרוטוקולים של המערכת (בדרך כלל /etc/protocols). השימוש הנפוץ הוא הפיכת מספר פרוטוקול שנשלף מהחוט, מטבלת ניתוב, או שהוחזר על־ידי getsockopt לשם קריא לאדם.

תקציר#

getprotobynumber NUMBER

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

In list context, a three-element list:

my ($name, $aliases, $proto) = getprotobynumber($number);
  • $name - שם פרוטוקול קנוני ("tcp", "udp", "icmp").

  • $aliases - מחרוזת מופרדת ברווחים של שמות חלופיים לפרוטוקול, או המחרוזת הריקה אם אין.

  • $proto - מספר הפרוטוקול שהועבר פנימה, מוחזר מרשומת מסד הנתונים.

בהקשר סקלר, מקבלים $name בלבד. אם המספר אינו במסד הנתונים, ערך ההחזרה בהקשר סקלר הוא undef וערך ההחזרה ברשימה הוא ריק.

my $name = getprotobynumber(6);         # "tcp"
my @rec  = getprotobynumber(6);         # ("tcp", "", 6)
my $none = getprotobynumber(9999);      # undef

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

חולק את הסמן של מסד נתוני הפרוטוקולים עם getprotobyname, getprotoent, setprotoent, ו־endprotoent. קריאה ל־getprotobynumber אינה מפריעה לאיטרציה בעיצומה ברוב המערכות, אך קוד נייד שמשלב חיפושים בודדים עם איטרציית getprotoent צריך לקרוא ל־setprotoent לאחר מכן כדי לאפס את הסמן.

בכישלון, $! מוגדר ל־errno הבסיסי, אם כי רוב המימושים פשוט מחזירים ״לא נמצא״ מבלי להגדיר errno.

דוגמאות#

פתרון השם הקנוני של מספר פרוטוקול:

my $name = getprotobynumber(6);
print "$name\n";                        # "tcp"

רשומה מלאה עם כינויים:

my ($name, $aliases, $proto) = getprotobynumber(1);
print "$name ($proto): $aliases\n";     # e.g. "icmp (1): ICMP"

חיפוש הפוך לפרוטוקול שנשלף מכותרת חבילה:

sub protocol_label {
    my ($num) = @_;
    my $name = getprotobynumber($num);
    return defined $name ? $name : "proto-$num";
}

נסיעה חזור מול getprotobyname - שימושי כבדיקת שפיות שמסד נתוני הפרוטוקולים של המערכת מכיר את השם שמצופה:

my $num  = getprotobyname("tcp");       # 6
my $back = getprotobynumber($num);      # "tcp"

הדפסה יפה של רמת getsockopt. הארגומנט level של getsockopt הוא מספר פרוטוקול; getprotobynumber הופך אותו חזרה לתווית עבור רישום:

my ($level) = unpack("I", $packed_level);
printf "socket option at level %s\n", getprotobynumber($level) // $level;

מקרי קצה#

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

    getprotobynumber $number eq 'icmp'    # WRONG - equivalent to:
    getprotobynumber($number eq 'icmp')   # looks up protocol 0 or 1
    getprotobynumber($number) eq 'icmp'   # what you meant
    

    תמיד יש לעטוף את הארגומנט בסוגריים בעת השוואת התוצאה, או להציב תחילה את החיפוש במשתנה.

  • מספר לא־מוכר: ערך ההחזרה בהקשר סקלר הוא undef; ערך ההחזרה ברשימה הוא הרשימה הריקה. יש להגן באמצעות defined:

    defined(my $name = getprotobynumber($n))
        or die "unknown protocol number $n";
    
  • ארגומנט לא־שלם: מומר למספר שלם באמצעות הכפיית סוגים מספרית הרגילה לפני החיפוש. מחרוזת כמו "tcp" נכפית ל־0 ומתקבלת הרשומה (אם ישנה) הרשומה עבור פרוטוקול 0, שהיא בדרך כלל "ip". עבור חיפוש מבוסס שם, השתמשו ב־getprotobyname.

  • מספרים שליליים או מחוץ לטווח: אין רשומה, מוחזר ריק / undef. לא מועלית אזהרה.

  • ממשק העצמים של Net::protoent. אם מייבאים את Net::protoent, getprotobynumber נדרס להחזיר עצם blessed עם accessor־ים בעלי שמות ($p->name, $p->aliases, $p->proto). שימושי כאשר לא רוצים לזכור סדר שדות מיקומי.

  • חיפוש מסד נתונים, לא רפלקציה על מחסנית הפרוטוקולים. פונקציה זו קוראת את /etc/protocols (או את מקור ה־NSS המקביל). היא אומרת איזה שם המערכת מקצה למספר; היא אינה אומרת אם הקרנל אכן תומך בפרוטוקול זה או אם ניתן לפתוח סוקט מסוג כזה.

הבדלים מ־upstream#

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

ראו גם#

  • getprotobyname - ההיפוך: חיפוש רשומת פרוטוקול לפי שם כאשר יש תווית כמו "tcp" ונחוץ המספר

  • getprotoent - עוברים על כל רשומה במסד נתוני הפרוטוקולים, כאשר רוצים לרשום או לאנדקס את כולם

  • setprotoent - פתיחה מחדש / החזרה לאחור של סמן מסד־נתוני־הפרוטוקולים; שלבו עם endprotoent סביב איטרציה

  • getservbyport - האנלוג לטבלת השירותים, הפיכת מספר פורט לשם שירות

  • getsockopt - מחזיר מספר פרוטוקול בארגומנט ה־level שלו; הזינו אותו ל־getprotobynumber לקבלת רישומים קריאים

  • Socket - מייצא את הקבועים IPPROTO_* שהערכים המספריים שלהם הם מה שמועברים פנימה