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

getnetent#

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

Η getnetent περιβάλλει την ομώνυμη ρουτίνα της βιβλιοθήκης C. Διατρέχει τη βάση δεδομένων δικτύων του συστήματος (συνήθως το /etc/networks, ενίοτε ενισχυμένη από NIS ή άλλα backend αναλυτών) μία εγγραφή τη φορά, επιστρέφοντας την επόμενη εγγραφή σε κάθε κλήση. Συνδυάστε την με την setnetent για επαναφορά ή έλεγχο της σύνδεσης, και με την endnetent για κλείσιμό της.

Σύνοψη#

my ($name, $aliases, $addrtype, $net) = getnetent;
my $name                              = getnetent;   # scalar context

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

Σε περιβάλλον λίστας, μια λίστα τεσσάρων στοιχείων:

  • $name - κανονικό όνομα δικτύου (π.χ. "loopback").

  • $aliases - συμβολοσειρά εναλλακτικών ονομάτων διαχωρισμένων με κενά.

  • $addrtype - οικογένεια διευθύνσεων, τυπικά AF_INET (2).

  • $net - αριθμός δικτύου ως ακέραιος σε σειρά bytes του υπολογιστή. Μετατροπή σε μορφή τελειών με Socket::inet_ntoa(pack("N", $net)).

Σε βαθμωτό περιβάλλον, μόνο το $name.

Όταν ο επαναλήπτης εξαντληθεί (δεν υπάρχουν άλλες εγγραφές), το περιβάλλον λίστας επιστρέφει την κενή λίστα και το βαθμωτό περιβάλλον επιστρέφει undef. Μια ελλείπουσα εγγραφή κατά την άμεση αναζήτηση επιστρέφει μία χωρίς νόημα αληθή τιμή σύμφωνα με τη σύμβαση perlfunc, αλλά δεδομένου ότι η getnetent δεν δέχεται κλειδί, η μόνη τερματική συνθήκη είναι «τέλος της βάσης».

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

Η getnetent διαβάζει από έναν επαναλήπτη καθολικό σε επίπεδο διεργασίας που διατηρείται από τη βιβλιοθήκη C. Κάθε κλήση προχωρά αυτόν τον επαναλήπτη· δεν υπάρχει κατάσταση ανά εμβέλεια, και ταυτόχρονη επανάληψη από δύο σημεία της ίδιας διεργασίας θα διαπλέκει εγγραφές. Η setnetent τον επαναφέρει και προαιρετικά ζητά από τη βιβλιοθήκη να διατηρήσει ανοιχτή την υποκείμενη σύνδεση για όλη τη διάρκεια της επανάληψης· η endnetent τον κλείνει.

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

Διάσχιση ολόκληρης της βάσης δεδομένων δικτύων:

setnetent(1);
while (my ($name, $aliases, $addrtype, $net) = getnetent) {
    printf "%-20s %s\n", $name, join(" ", split / /, $aliases);
}
endnetent();

Το βαθμωτό περιβάλλον δίνει μόνο το όνομα - χρήσιμο για γρήγορη απαρίθμηση:

setnetent(1);
while (defined(my $name = getnetent)) {
    print "$name\n";
}
endnetent();

Αποκωδικοποίηση του αριθμού δικτύου σε μορφή τελειών:

use Socket;
setnetent(1);
while (my ($name, undef, undef, $net) = getnetent) {
    printf "%-20s %s\n", $name, inet_ntoa(pack "N", $net);
}
endnetent();

Αντικειμενοστραφής πρόσβαση μέσω Net::netent - η διεπαφή ανά όνομα από την standard library αντικαθιστά τη λίστα επιστροφής κατά θέση με ένα blessed αντικείμενο:

use Net::netent;
while (my $n = getnetent()) {
    printf "%s => %d\n", $n->name, $n->net;
}

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

  • Εξάντληση επαναλήπτη: το περιβάλλον λίστας επιστρέφει (), το βαθμωτό περιβάλλον επιστρέφει undef. Οι μορφές βρόχου παραπάνω τερματίζονται φυσιολογικά.

  • Χωρίς setnetent πριν τον βρόχο: η πρώτη κλήση ανοίγει σιωπηρά τη βάση. Η κλήση της setnetent(1) εξακολουθεί να συνιστάται - χωρίς τη σημαία «παραμονή ανοιχτή», ορισμένες βιβλιοθήκες C ξανανοίγουν το αρχείο σε κάθε εγγραφή και η απόδοση καταρρέει.

  • Πολλαπλές ταυτόχρονες διασχίσεις: ο επαναλήπτης είναι καθολικός σε επίπεδο διεργασίας. Δύο βρόχοι επί της getnetent στην ίδια διεργασία θα μοιραστούν τις εγγραφές μεταξύ τους. Συλλέξτε σε πίνακα πρώτα αν και οι δύο χρειάζονται το πλήρες σύνολο.

  • Μη υποστηριζόμενο σε ορισμένες πλατφόρμες: τα Windows δεν έχουν αντίστοιχο /etc/networks και η υποκείμενη ρουτίνα C απουσιάζει. Η προσπάθεια κλήσης της getnetent εκεί εγείρει The getnetent function is unimplemented. Στο Linux, η glibc παρέχει τη συνάρτηση αλλά η βάση είναι συχνά κενή - τα περισσότερα συστήματα βασίζονται σε DNS αντ’ αυτού, το οποίο αυτή η διεπαφή δεν συμβουλεύεται.

  • Ασφάλεια νημάτων: ο επαναλήπτης της βιβλιοθήκης C δεν είναι ασφαλής για νήματα. Η Perl ενδέχεται να αντικαταστήσει διαφανώς με getnetent_r σε συστήματα που την παρέχουν, αλλά μην υποθέσετε ότι αυτό είναι καθολικό. Σε πρόγραμμα με νήματα, σειριοποιήστε την πρόσβαση μέσω ενός μόνο νήματος.

  • Tainting: όταν είναι ενεργοποιημένο το tainting, και τα τέσσερα πεδία επιστροφής είναι tainted - προέρχονται από αρχείο (ή απομακρυσμένο αναλυτή) εκτός του ελέγχου του προγράμματος.

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

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

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

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

  • endnetent - κλείνει τον επαναλήπτη όταν τελειώσετε

  • getnetbyname - αναζήτηση ενός δικτύου με όνομα αντί για διάσχιση ολόκληρης της βάσης

  • getnetbyaddr - αναζήτηση ενός δικτύου με τη διεύθυνσή του

  • gethostent - η ανάλογη διάσχιση της βάσης δεδομένων υπολογιστών, με το ίδιο συμπληρωματικό ζεύγος set/end

  • Net::netent - αντικειμενική διεπαφή ανά όνομα που αντικαθιστά τη λίστα επιστροφής κατά θέση