Πληροφορίες δικτύου

getprotoent#

Λαμβάνει την επόμενη εγγραφή από τη βάση δεδομένων πρωτοκόλλων.

Η getprotoent διασχίζει τη βάση δεδομένων πρωτοκόλλων του συστήματος - σε παραδοσιακά συστήματα τύπου Unix είναι το /etc/protocols, σε σύγχρονα συστήματα ό,τι αντιστοιχίζει σε αυτή η C library και η στοίβα NSS - επιστρέφοντας μία εγγραφή ανά κλήση μέχρι να εξαντληθεί η βάση δεδομένων. Είναι το σκέλος επανάληψης της τριάδας setprotoent / getprotoent / endprotoent. Καταφύγετε στην getprotobyname ή την getprotobynumber όταν θέλετε μια μόνο στοχευμένη αναζήτηση· η getprotoent είναι για απαρίθμηση κάθε πρωτοκόλλου που γνωρίζει το σύστημα.

Ο δρομέας επανάληψης μοιράζεται σε επίπεδο διεργασίας και ανήκει στη C library. Η setprotoent τον επαναφέρει στην αρχή και προαιρετικά καρφώνει ανοιχτό τον υποκείμενο περιγραφέα· η endprotoent τον κλείνει. Μεταξύ αυτών των δύο κλήσεων η getprotoent αποδίδει κάθε εγγραφή με τη σειρά, και μετά επιστρέφει την κενή λίστα (ή undef σε βαθμωτό περιβάλλον) μόλις δεν απομένει τίποτα άλλο.

Σύνοψη#

my ($name, $aliases, $proto) = getprotoent;
my $name = getprotoent;

Τι επιστρέφεται#

Περιβάλλον λίστας - λίστα τριών στοιχείων που αντικατοπτρίζει το C struct protoent:

  • $name - το κανονικό όνομα πρωτοκόλλου, π.χ. "tcp", "udp", "icmp".

  • $aliases - συμβολοσειρά εναλλακτικών ονομάτων για το ίδιο πρωτόκολλο, διαχωρισμένων με κενά. Συχνά κενή.

  • $proto - ο αριθμητικός αριθμός πρωτοκόλλου όπως χρησιμοποιείται στις κεφαλίδες IP και γίνεται δεκτός από τις socket / getsockopt.

Στο τέλος της βάσης δεδομένων η επιστροφή είναι η κενή λίστα. Η σημείωση του upstream perlfunc για «μια μοναδική άνευ νοήματος αληθή τιμή» για απούσες εγγραφές αφορά τις αναζητήσεις κατά όνομα και κατά αριθμό, όχι την getprotoent - η υπέρβαση του τέλους της επανάληψης είναι καθαρή κενή λίστα.

Βαθμωτό περιβάλλον - μόνο το κανονικό $name, ή undef στο τέλος της βάσης δεδομένων. Χρησιμοποιήστε περιβάλλον λίστας όποτε χρειάζεστε τον αριθμό ή τα ψευδώνυμα· δεν μπορείτε να τα ανακατασκευάσετε από το όνομα εκ των υστέρων.

Διασπάστε τα ψευδώνυμα σε λίστα με μια απλή split:

my @alts = split ' ', $aliases;

Καθολική κατάσταση που επηρεάζει#

  • Ο δρομέας της βάσης δεδομένων πρωτοκόλλων, ένας πόρος ανά διεργασία που ανήκει στη C library και μοιράζεται με τις setprotoent, endprotoent, getprotobyname και getprotobynumber. Μια αναζήτηση κατά όνομα ή κατά αριθμό μπορεί να επαναφέρει τον δρομέα στη μέση της επανάληψης σε κάποιες πλατφόρμες - δείτε Οριακές περιπτώσεις.

  • Δεν διαβάζονται ή γράφονται ειδικές μεταβλητές σε επίπεδο Perl. Σε αντίθεση με την gethostent, οι ρουτίνες πρωτοκόλλων δεν έχουν ισοδύναμο h_errno, οπότε η $? δεν θίγεται. Το τέλος της βάσης δεδομένων δεν είναι αποτυχία και δεν θέτει την $!.

Παραδείγματα#

Απαρίθμηση κάθε πρωτοκόλλου που γνωρίζει το σύστημα:

setprotoent(1);
while (my ($name, $aliases, $proto) = getprotoent) {
    print "$proto\t$name\t$aliases\n";
}
endprotoent;

Βαθμωτό περιβάλλον - παραθέστε μόνο τα κανονικά ονόματα:

setprotoent(0);
while (defined(my $name = getprotoent)) {
    print "$name\n";
}
endprotoent;

Δομήστε αντιστοιχία ονόματος-σε-αριθμό σε ένα πέρασμα ώστε οι μετέπειτα αναζητήσεις να μην χτυπούν καθόλου τη βάση δεδομένων:

my %proto_num;
setprotoent(1);
while (my ($name, $aliases, $num) = getprotoent) {
    $proto_num{$name} = $num;
    $proto_num{$_}    = $num for split ' ', $aliases;
}
endprotoent;

print $proto_num{"tcp"}, "\n";          # 6

Διεπαφή ανά εγγραφή μέσω της παράκαμψης Net::protoent - μέθοδοι προσπέλασης αντί για θεσιακό αποπακετάρισμα:

use Net::protoent;
while (my $p = getprotoent) {
    printf "%-10s %3d\n", $p->name, $p->proto;
}

Οριακές περιπτώσεις#

  • Καμία σιωπηρή επαναφορά. Η getprotoent δεν ανοίγει ούτε επαναφέρει τη βάση δεδομένων από μόνη της. Η πρώτη κλήση μετά την εκκίνηση του προγράμματος λειτουργεί επειδή η C library ανοίγει το αρχείο τεμπέλικα, αλλά μόλις φτάσει το τέλος, οι επόμενες κλήσεις συνεχίζουν να επιστρέφουν τέλος-βάσης μέχρι μια setprotoent να επαναφέρει τον δρομέα. Πάντα οριοθετήστε την απαρίθμηση με ρητή setprotoent και endprotoent.

  • Το τέλος της βάσης δεδομένων είναι η κενή λίστα, όχι undef. Σε περιβάλλον λίστας η συνθήκη βρόχου while (my @r = getprotoent) λειτουργεί επειδή η κενή λίστα είναι ψευδής. Σε βαθμωτό περιβάλλον χρησιμοποιήστε while (defined(my $name = getprotoent)) - όνομα πρωτοκόλλου "0" είναι θεωρητικά έγκυρο και θα τερμάτιζε ψευδώς έναν βρόχο που στηρίζεται στην αληθότητα.

  • Τα ψευδώνυμα είναι ένα βαθμωτό, όχι λίστα. Το $aliases είναι μία ενιαία συμβολοσειρά διαχωρισμένη με κενά· διασπάστε σε λευκούς χαρακτήρες αν θέλετε λίστα. Κενό πεδίο ψευδωνύμων είναι η συνηθισμένη περίπτωση, όχι σφάλμα.

  • Παρεμβολή με αναζητήσεις κατά όνομα / κατά αριθμό. Μια κλήση σε getprotobyname ή getprotobynumber κατά τη διάρκεια μιας διάσχισης μπορεί να επαναφέρει τον κοινό δρομέα σε κάποιες πλατφόρμες. Ολοκληρώστε πρώτα την επανάληψη, ή επανεκκινήστε την με setprotoent μετά την αναζήτηση.

  • Μη επανεισόδιμη. Ο δρομέας της βάσης δεδομένων είναι ένας μοναδικός καθολικός πόρος μέσα στη C library. Δύο ταυτόχρονες επαναλήψεις στην ίδια διεργασία - σε διαφορετικά threads, χειριστές σήματος ή εμφωλευμένες επιστροφές κλήσεων - διαφθείρουν την κατάσταση η μία της άλλης. Περιορίστε κάθε διάσχιση σε ένα thread τη φορά.

  • Πλατφόρμες χωρίς βάση δεδομένων πρωτοκόλλων. Σε συστήματα χωρίς ισοδύναμο /etc/protocols, η κλήση είναι no-op που επιστρέφει αμέσως την κενή λίστα αντί να εγείρει σφάλμα. Δείτε το perlport για την πλήρη λίστα ιδιαιτεροτήτων βάσεων δεδομένων δικτύου.

  • Tainting. Οι εγγραφές προέρχονται από αρχείο που διαβάζει ο πυρήνας για λογαριασμό σας και δεν σημειώνονται ως tainted. Αντιμετωπίστε τις ως μη έμπιστες έτσι κι αλλιώς όταν το αρχείο είναι εγγράψιμο από τον χρήστη.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • setprotoent - επαναφέρει τον επαναλήπτη στην αρχή και προαιρετικά καρφώνει ανοιχτό τον υποκείμενο περιγραφέα για όλη τη διάσχιση

  • endprotoent - κλείνει τον επαναλήπτη και απελευθερώνει το handle της βάσης δεδομένων μόλις ολοκληρωθεί η απαρίθμηση

  • getprotobyname - στοχευμένη αναζήτηση με όνομα πρωτοκόλλου αντί για πλήρη απαρίθμηση

  • getprotobynumber - στοχευμένη αναζήτηση με αριθμητικό αριθμό πρωτοκόλλου

  • getservent - ίδιο μοτίβο επανάληψης για τη βάση δεδομένων υπηρεσιών, η οποία αναφέρεται σε ονόματα πρωτοκόλλων από αυτήν εδώ

  • gethostent - ίδιο ιδίωμα για τη βάση δεδομένων υπολογιστών