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"
Πλήρης εγγραφή με aliases:
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 αντικείμενο με κατονομασμένους accessors ($p->name,$p->aliases,$p->proto). Βολικό όταν δεν θέλετε να θυμάστε τη σειρά των πεδίων κατά θέση.Αναζήτηση βάσης δεδομένων, όχι ενδοσκόπηση στοίβας πρωτοκόλλων. Αυτή η συνάρτηση διαβάζει το
/etc/protocols(ή την αντίστοιχη πηγή NSS). Σας λέει ποιο όνομα εκχωρεί το σύστημα σε έναν αριθμό· δεν σας λέει αν ο πυρήνας υποστηρίζει όντως αυτό το πρωτόκολλο ούτε αν μπορεί να ανοιχτεί μια υποδοχή αυτού του τύπου.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getprotobyname- η αντίστροφη: αναζητά μια εγγραφή πρωτοκόλλου με το όνομα όταν έχετε ετικέτα όπως"tcp"και χρειάζεστε τον αριθμόgetprotoent- διατρέχει κάθε εγγραφή στη βάση πρωτοκόλλων, όταν θέλετε να τις απαριθμήσετε ή ευρετηριάσετε όλεςsetprotoent- ξανανοίγει / επαναφέρει τον δρομέα της βάσης πρωτοκόλλων· συνδυάστε μεendprotoentγύρω από μια επανάληψηgetservbyport- το ανάλογο του πίνακα υπηρεσιών, μετατρέπει έναν αριθμό θύρας σε όνομα υπηρεσίαςgetsockopt- επιστρέφει αριθμό πρωτοκόλλου ως το όρισμά τηςlevel· τροφοδοτήστε το στηνgetprotobynumberγια ευανάγνωστα logsSocket- εξάγει τις σταθερέςIPPROTO_*, των οποίων τις αριθμητικές τιμές περνάτε ως όρισμα