Pregunta

Estoy trabajando en hacer una aplicación de servidor simple con python, y estoy tratando de obtener la IP para enlazar el socket de escucha. Un ejemplo que miré usa esto:

HOST = gethostbyaddr(gethostname())

Con un poco más de procesamiento después de esto, debería darme solo la IP del host como una cadena. Esto debería devolver la dirección IPv4. Pero cuando ejecuto este código, devuelve mi dirección IPv6. ¿Por qué hace esto y cómo puedo obtener mi dirección IPv4?

Si es relevante, estoy usando Windows Vista y Python 2.5

¿Fue útil?

Solución

Obtener tu dirección IP es más difícil de lo que piensas.

Marque esta respuesta di por la única forma confiable que he encontrado.

Esto es lo que dice la respuesta en caso de que no le guste hacer clic en las cosas:

Utilice el módulo netifaces . Debido a que la red es compleja, usar netifaces puede ser un poco complicado, pero aquí le explicamos cómo hacer lo que quiere:

>>> 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

Esto se puede hacer un poco más legible de esta manera:

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

Si desea direcciones IPv6, use AF_INET6 en lugar de AF_INET . Si se pregunta por qué netifaces usa listas y diccionarios por todas partes, es porque una sola computadora puede tener múltiples NIC, y cada NIC puede tener múltiples direcciones, y cada dirección tiene su propio conjunto de opciones .

Otros consejos

IPv6 está tomando precedencia sobre IPv4 ya que es la familia más nueva, generalmente es lo que usted quiere si su nombre de host está asociado con varias familias. Debería estar usando getaddrinfo para una resolución independiente de la familia, aquí hay un ejemplo,

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];

Lo que en un host configurado de doble pila me da lo siguiente,

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 () toma una dirección IP como parámetro, no un nombre de host, por lo que me sorprende que esté funcionando en absoluto sin lanzar una excepción. Si, en cambio, quisiste decir gethostbyname () , entonces sus resultados son más sorprendentes, ya que esa función afirma que no admite IPv6. la respuesta de Harley explica cómo obtener correctamente su dirección IP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top