Question

Je travaille sur la création d’une application serveur simple avec python, et j’essaie de faire en sorte que l’IP lie le socket d’écoute. Un exemple que j'ai consulté utilise ceci:

HOST = gethostbyaddr(gethostname())

Avec un peu plus de traitement après cela, cela devrait me donner uniquement l'adresse IP de l'hôte sous forme de chaîne. Cela devrait retourner l'adresse IPv4. Mais lorsque je lance ce code, il retourne mon adresse IPv6. Pourquoi fait-il cela et comment puis-je obtenir mon adresse IPv4?

Si c'est pertinent, j'utilise Windows Vista et Python 2.5

Était-ce utile?

La solution

Obtenir votre adresse IP est plus difficile que vous ne le pensez.

Vérifiez cette réponse que j'ai donnée pour le moyen fiable que j'ai trouvé.

Voici ce que dit la réponse si vous n'aimez pas cliquer sur des choses:

Utilisez le module netifaces . La mise en réseau étant complexe, utiliser des netifaces peut être un peu délicat, mais voici comment faire ce que vous voulez:

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

Cela peut être rendu un peu plus lisible comme ceci:

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 vous voulez des adresses IPv6, utilisez AF_INET6 au lieu de AF_INET . Si vous vous demandez pourquoi netifaces utilise des listes et des dictionnaires partout, c'est parce qu'un même ordinateur peut avoir plusieurs cartes réseau et que chaque carte peut avoir plusieurs adresses et que chaque adresse possède son propre ensemble d'options. .

Autres conseils

IPv6 a priorité sur IPv4 car il s’agit de la famille la plus récente. C’est généralement ce que vous voulez si votre nom d’hôte est associé à plusieurs familles. Vous devriez utiliser getaddrinfo pour la résolution indépendante de la famille, voici un exemple,

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

Ce qui, sur un hôte configuré à double pile, me donne les informations suivantes,

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 () prend une adresse IP en tant que paramètre, pas un nom d’hôte, je suis donc surpris que cela fonctionne sans aucune exception. Si vous vouliez plutôt dire gethostbyname () alors vos résultats sont plus surprenants, puisque cette fonction prétend ne pas supporter IPv6. La réponse de Harley explique comment obtenir correctement votre adresse IP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top