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

getnetbyaddr#

Αναζητά μια εγγραφή δικτύου με βάση τη αριθμητική διεύθυνση δικτύου του.

Η getnetbyaddr μεταφράζει έναν αριθμητικό αριθμό δικτύου και μια οικογένεια διευθύνσεων σε εγγραφή της βάσης δεδομένων δικτύου καλώντας τη ρουτίνα C getnetbyaddr(3) του συστήματος. Είναι αντίστροφη της getnetbyname και συμβουλεύεται την ίδια βάση δεδομένων δικτύου του συστήματος (τυπικά /etc/networks ή ένα backend NSS). Σε βαθμωτό περιβάλλον επιστρέφει μόνο το κανονικό όνομα δικτύου· σε περιβάλλον λίστας επιστρέφει την πλήρη εγγραφή.

Σύνοψη#

my $name = getnetbyaddr $addr, $addrtype;
my ($name, $aliases, $addrtype, $net) = getnetbyaddr $addr, $addrtype;

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

Βαθμωτό περιβάλλον - το κανονικό όνομα του δικτύου, ή undef αν δεν ταιριάζει καμία εγγραφή.

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

  • $name - το κανονικό όνομα δικτύου.

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

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

  • $net - ο αριθμός δικτύου ως μη προσημασμένος ακέραιος, σε host byte order.

Σε αποτυχία αναζήτησης σε περιβάλλον λίστας, η επιστροφή είναι η κενή λίστα. Αν η εγγραφή υπάρχει αλλά είναι κενή, η επιστροφή είναι μία μοναδική χωρίς νόημα αληθής τιμή, σύμφωνα με την κοινή σύμβαση της οικογένειας get*.

Ορίσματα#

  • ADDR - ο αριθμός δικτύου ως ακέραιος σε host byte order, όχι ως πακεταρισμένη συμβολοσειρά. Αυτή είναι η εγγενής ακέραια μορφή που λαμβάνετε πίσω από προηγούμενη κλήση getnetbyname, ή που δημιουργείτε με Socket::inet_aton ακολουθούμενη από unpack("N", ...) για να μετατρέψετε από network σε host order.

  • ADDRTYPE - η οικογένεια διευθύνσεων, σχεδόν πάντα AF_INET από το άρθρωμα Socket.

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

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

  • $! - η τιμή errno της C σε αποτυχία, όπου η πλατφόρμα την θέτει. Οι περισσότερες αναζητήσεις στο /etc/networks αποτυγχάνουν σιωπηλά με το errno ανέγγιχτο, οπότε αντιμετωπίστε το undef ως το πρωτεύον σήμα αποτυχίας.

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

Αναζητήστε το δίκτυο loopback με βάση τον ακέραιο αριθμό του:

use Socket;
my $name = getnetbyaddr(127 << 24, AF_INET);
print "$name\n";                     # loopback

Περιβάλλον λίστας - η πλήρης εγγραφή:

use Socket;
my ($name, $aliases, $type, $net)
    = getnetbyaddr(127 << 24, AF_INET);
printf "%s (net=%08x)\n", $name, $net;

Πλήρης κύκλος από συμβολοσειρά με τελείες, μέσω του Socket:

use Socket;
my $packed = inet_aton("127.0.0.0");     # packed, network order
my $net    = unpack("N", $packed);        # integer, host order
my $name   = getnetbyaddr($net, AF_INET);

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

use Net::netent;
my $n = getnetbyaddr(127 << 24, AF_INET);
print $n->name, "\n" if defined $n;

Μπροστινή και έπειτα αντίστροφη - επιλύστε ένα όνομα, και έπειτα ψάξτε πίσω τη διεύθυνση:

use Socket;
my $net  = (getnetbyname("loopback"))[3];
my $back = getnetbyaddr($net, AF_INET);
print "$back\n";                          # loopback

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

  • Ακέραιος, όχι πακεταρισμένη συμβολοσειρά. Το ADDR είναι απλός ακέραιος σε host byte order. Το πέρασμα εδώ της πακεταρισμένης μορφής τεσσάρων bytes που καταναλώνει η gethostbyaddr θα αναζητήσει σιωπηλά τον λάθος αριθμό. Αυτό είναι το πιο συνηθισμένο λάθος με αυτή τη συνάρτηση.

  • Μόνο κλασικά (classful), στα περισσότερα συστήματα. Η υποκείμενη βάση δεδομένων /etc/networks προηγείται του CIDR. Οι εγγραφές είναι classful αριθμοί δικτύου (π.χ. 127, 10, 192.168), και η κλήση συστήματος δεν είναι χρήσιμη για αυθαίρετα υποδίκτυα CIDR. Για σύγχρονη συλλογιστική υποδικτύων χρησιμοποιήστε το Socket ή ένα άρθρωμα CPAN όπως το NetAddr::IP.

  • Κενό /etc/networks. Πολλές διανομές Linux παρέχουν σχεδόν κενό /etc/networks· περιμένετε οι περισσότερες αναζητήσεις να επιστρέφουν undef σε τέτοιον host. Πρόκειται για γεγονός διαμόρφωσης, όχι για σφάλμα στην κλήση.

  • Κενή εγγραφή βάσης δεδομένων σε περιβάλλον λίστας. Σύμφωνα με τον κοινό κανόνα της οικογένειας get*, μια εγγραφή που υπάρχει αλλά δεν έχει πεδία επιστρέφει μία μοναδική χωρίς νόημα αληθή τιμή, όχι τη λίστα πέντε στοιχείων. Στην πράξη καμία πλατφόρμα δεν παράγει τέτοια εγγραφή για δίκτυα· προφυλαχθείτε με defined και μέτρηση στοιχείων αν σας ενδιαφέρει.

  • ADDRTYPE άλλο από AF_INET. Η βιβλιοθήκη C δέχεται το όρισμα αλλά δεν έχει καθορισμένη συμπεριφορά για μη-Internet οικογένειες εδώ. Περάστε AF_INET εκτός αν το σύστημα-στόχος τεκμηριώνει διαφορετικά.

  • Ασφάλεια threads. Η υποκείμενη ρουτίνα C διατηρεί στατική κατάσταση ανά διεργασία για τον δρομέα του δικτύου. Ταυτόχρονες κλήσεις από πολλαπλά threads μπορεί να αναμείξουν αποτελέσματα. Όπου η πλατφόρμα προσφέρει getnetbyaddr_r, η Perl την αντικαθιστά αυτόματα.

  • Προτεραιότητα τελεστή λίστας. Όπως η υπόλοιπη οικογένεια get*, η getnetbyaddr αναλύεται ως τελεστής λίστας. Το getnetbyaddr $n, AF_INET or die συνδέει το or die με ολόκληρη τη λίστα ορισμάτων, που συνήθως είναι αυτό που θέλετε· προσθέστε παρενθέσεις σε περίπτωση αμφιβολίας.

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

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

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

  • getnetbyname - η μπροστινή αναζήτηση: κανονικό όνομα ή ψευδώνυμο → εγγραφή δικτύου

  • getnetent - επαναλάβετε κάθε εγγραφή στη βάση δεδομένων δικτύου αντί να αναζητήσετε μία διεύθυνση

  • setnetent - επαναφέρετε στην αρχή τον επαναλήπτη δικτύου και ελέγξτε αν η βάση δεδομένων παραμένει ανοιχτή μεταξύ αναζητήσεων

  • endnetent - κλείστε τη βάση δεδομένων δικτύου όταν τελειώσετε με την επανάληψη

  • gethostbyaddr - το αντίστοιχο σε επίπεδο host· δέχεται πακεταρισμένη διεύθυνση, όχι ακέραιο

  • Net::netent - wrapper ανά όνομα που επιστρέφει αντικείμενο με προσπελάσεις name / aliases / addrtype / net