Frage

Ich arbeite eine einfache Server-Anwendung mit Python auf zu machen, und ich versuche, die IP zu erhalten, die Abhörsocket zu binden. Ein Beispiel, das ich sah verwendet diese:

HOST = gethostbyaddr(gethostname())

Mit etwas mehr Verarbeitung nach diesem, sollte es mir geben nur die Host-IP als String zurück. Dies sollte die IPv4-Adresse zurück. Aber wenn ich diesen Code ausführen, gibt es meine IPv6-Adresse. Warum macht es dies tun, und wie kann ich meine IPv4-Adresse bekommen?

Wenn seine relevant, ich bin mit Windows Vista und Python 2.5

War es hilfreich?

Lösung

Ihre IP-Adresse zu erhalten ist schwieriger, als Sie vielleicht denken.

Überprüfen Sie netifaces Modul. Da Vernetzung komplexer, netifaces verwendet, kann ein wenig schwierig sein, aber hier ist, wie zu tun, was Sie wollen:

>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0']
>>> netifaces.ifaddresses('eth0')
{17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:11:2f:32:63:45'}], 2: [{'broadcast': '10.0.0.255', 'netmask': '255.255.255.0', 'addr': '10.0.0.2'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::211:2fff:fe32:6345%eth0'}]}
>>> for interface in netifaces.interfaces():
...   print netifaces.ifaddresses(interface)[netifaces.AF_INET]
...
[{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}]
[{'broadcast': '10.0.0.255', 'netmask': '255.255.255.0', 'addr': '10.0.0.2'}]
>>> for interface in netifaces.interfaces():
...   for link in netifaces.ifaddresses(interface)[netifaces.AF_INET]:
...     print link['addr']
...
127.0.0.1
10.0.0.2

Dies kann ein wenig besser lesbar wie folgt vorgenommen werden:

from netifaces import interfaces, ifaddresses, AF_INET

def ip4_addresses():
    ip_list = []
    for interface in interfaces():
        for link in ifaddresses(interface)[AF_INET]:
            ip_list.append(link['addr'])
    return ip_list

Wenn Sie IPv6-Adressen möchten, verwenden Sie AF_INET6 statt AF_INET. Wenn Sie sich fragen, warum netifaces Listen und Wörterbücher verwenden alle über den Platz, es ist, weil ein einzelner Computer mehr Netzwerkkarten haben kann, und jeder NIC kann mehrere Adressen hat, und jede Adresse hat seine eigene Reihe von Optionen.

Andere Tipps

IPv6 Vorrang vor IPv4 wie es die neuere Familie ist, ist es im Allgemeinen, was Sie wollen, wenn Ihre Host-Namen mit mehreren Familien verbunden ist. Sie sollten verwenden Getaddrinfo für Familie unabhängige Auflösung, hier ist ein Beispiel,

import sys, socket;
host = socket.gethostname();
result = socket.getaddrinfo(host, None);
print "family:%i socktype:%i proto:%i canonname:%s sockaddr:%s"%result[0];
result = socket.getaddrinfo(host, None, socket.AF_INET);
print "family:%i socktype:%i proto:%i canonname:%s sockaddr:%s"%result[0];
result = socket.getaddrinfo(host, None, socket.AF_INET6);
print "family:%i socktype:%i proto:%i canonname:%s sockaddr:%s"%result[0];

, die auf einem Dual-Stack konfigurierten Host gibt mir die folgende,

family:10 socktype:1 proto:6 canonname: sockaddr:('2002:dce8:d28e::31', 0, 0, 0)
family:2 socktype:1 proto:6 canonname: sockaddr:('10.6.28.31', 0)
family:10 socktype:1 proto:6 canonname: sockaddr:('2002:dce8:d28e::31', 0, 0, 0)

gethostbyaddr() nimmt eine IP-Adresse als Parameter, keine Host-Name, also bin ich überrascht, dass es funktioniert überhaupt ohne eine Ausnahme zu werfen. Wenn stattdessen bedeuten, dass Sie gethostbyname() , dann sind Ihre Ergebnisse noch überraschender, da diese Funktion nicht beansprucht IPv6 zu unterstützen. Harley Antwort erklärt, wie richtig Ihre IP-Adresse erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top