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