getnetbyname#
Αναζητεί μια εγγραφή δικτύου με βάση το όνομα.
Η getnetbyname επιλύει ένα συμβολικό όνομα δικτύου (όπως παρατίθεται στη βάση δεδομένων δικτύων του συστήματος, τυπικά /etc/networks) στην αριθμητική του διεύθυνση δικτύου καλώντας τη ρουτίνα C getnetbyname(3). Η μορφή σε βαθμωτό περιβάλλον επιστρέφει τον αριθμό δικτύου· η μορφή σε περιβάλλον λίστας εκθέτει την πλήρη εγγραφή: κανονικό όνομα, ψευδώνυμα, οικογένεια διευθύνσεων και αριθμό δικτύου.
Σύνοψη#
my $net = getnetbyname $name;
my ($name, $aliases, $addrtype, $net) = getnetbyname $name;
Τι επιστρέφεται#
Βαθμωτό περιβάλλον - ο αριθμός δικτύου ως απλός ακέραιος, ή undef αν το όνομα δεν είναι στη βάση δεδομένων δικτύων. Πρόκειται για το τμήμα δικτύου σε σειρά bytes host μιας διεύθυνσης IPv4, όχι πακεταρισμένη συμβολοσειρά. Για το δίκτυο κλάσης C 192.168.0, η επιστρεφόμενη τιμή είναι 12625920 (δηλαδή 0xC0A800).
Περιβάλλον λίστας - λίστα τεσσάρων στοιχείων που αντικατοπτρίζει το C struct netent:
$name- το κανονικό όνομα δικτύου.$aliases- συμβολοσειρά εναλλακτικών ονομάτων διαχωρισμένων με κενά.$addrtype- η οικογένεια διευθύνσεων, τυπικάAF_INET(2).$net- ο αριθμός δικτύου, ίδιος ακέραιος με τη μορφή σε βαθμωτό περιβάλλον.
Σε αποτυχία αναζήτησης σε περιβάλλον λίστας, η επιστροφή είναι η κενή λίστα.
Καθολική κατάσταση που επηρεάζει#
Παραδείγματα#
Μορφή σε βαθμωτό περιβάλλον - αναζητήστε ένα κατονομασμένο δίκτυο και εκτυπώστε το ως τετράδα με τελείες:
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 - μέθοδοι προσπέλασης αντί για θεσιακό αποπακετάρισμα:
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.Ο επιστρεφόμενος αριθμός είναι σε σειρά bytes host, όχι πακεταρισμένη συμβολοσειρά. Σε αντίθεση με την
gethostbyname, που επιστρέφει πακεταρισμένη διεύθυνση τεσσάρων bytes, ηgetnetbynameεπιστρέφει απλό ακέραιο. Μην τον περάσετε στηνSocket::inet_ntoa- αυτή η συνάρτηση αναμένει πακεταρισμένη συμβολοσειρά και θα παράγει σκουπίδια από ακέραιο.Τα ψευδώνυμα είναι ένα βαθμωτό, όχι λίστα. Το
$aliasesστη μορφή λίστας είναι μία ενιαία συμβολοσειρά διαχωρισμένη με κενά. Διασπάστε σε λευκούς χαρακτήρες αν χρειάζεστε λίστα.Networks are typically class-boundary numbers. The entries in
/etc/networksare traditionally stored as the network portion only127for loopback,10for 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σε αποτυχία· το περιβάλλον λίστας επιστρέφει την κενή λίστα. Τα δύο δεν είναι εναλλάξιμα - κώδικας γραμμένος για το ένα περιβάλλον θα συμπεριφερθεί λανθασμένα στο άλλο.Ασφάλεια threads. Η υποκείμενη ρουτίνα C κρατάει ανά διεργασία στατική κατάσταση για τον δρομέα δικτύων. Ταυτόχρονες κλήσεις από πολλά threads μπορεί να αλληλομπλεχθούν στα αποτελέσματα.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
getnetbyaddr- η αντίστροφη αναζήτηση: αριθμός δικτύου → εγγραφή δικτύουgetnetent- επανάληψη σε κάθε εγγραφή της βάσης δεδομένων δικτύων αντί για αναζήτηση ενός ονόματοςsetnetent- επαναφορά του επαναλήπτη δικτύων στην αρχή και έλεγχος του αν το αρχείο παραμένει ανοιχτό μεταξύ αναζητήσεωνendnetent- κλείνει τη βάση δεδομένων δικτύων μετά από επανάληψηgethostbyname- ο αντίστοιχος σε επίπεδο υπολογιστή, για επίλυση ονόματος host σε διεύθυνση IPNet::netent- αντικειμενοστραφές περιτύλιγμα κατά όνομα που επιστρέφει μεθόδους προσπέλασης αντί για θεσιακή λίστα