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

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 - ο αριθμός δικτύου, ίδιος ακέραιος με τη μορφή σε βαθμωτό περιβάλλον.

Σε αποτυχία αναζήτησης σε περιβάλλον λίστας, η επιστροφή είναι η κενή λίστα.

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

  • Ο δρομέας επανάληψης της βάσης δεδομένων δικτύων που μοιράζεται με τις getnetent, setnetent και endnetent. Μια κλήση getnetbyname μπορεί να επαναφέρει έναν δρομέα που είχε αφεθεί ανοιχτός από τη getnetent.

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

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

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/networks are traditionally stored as the network portion only

    • 127 for loopback, 10 for 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 σε διεύθυνση IP

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