2010-10-07 7 views
1

Je cours mon code sur plusieurs VPS (avec plus d'un IP, qui sont configurés comme des alias aux interfaces réseau) et j'essaie de comprendre un manière que mon code acquiert les adresses IP à partir des interfaces réseau à la volée et s'y lient. Des idées sur la façon de le faire en python sans ajouter une bibliothèque tierce partie?Pour savoir comment obtenir toutes les ips publiques d'une machine

Modifier Je sais socket.gethostbyaddr(socket.gethostname()) et sur le paquet 3ème partie netifaces, mais je cherche quelque chose de plus élégant de la bibliothèque standard ... et analyse de la sortie de la commande ifconfig n'est pas quelque chose d'élégant :)

+0

Que voulez-vous besoin de l'adresse IP exacte pour? Si vous écrivez un serveur et que vous voulez écouter toutes les adresses disponibles, faites quelque chose comme 'mysocket.bind (('', 12345))' pour correspondre à toutes les adresses. –

+0

Je suis en train d'écrire un client et je veux faire un round robin entre les adresses et leur donner du travail :) – hyperboreean

+0

Est-ce votre but de demander au serveur toutes ses adresses, puis de faire en sorte que votre client se connecte à toutes? Ou essayez-vous plutôt de choisir l'adresse source à partir de laquelle votre client va se connecter? –

Répondre

0

Voici comment obtenir toutes les adresses IP du serveur le script est en cours d'exécution sur:

(ce qui est le plus élégant que possible et il a besoin que la bibliothèque standard)

import socket 
import fcntl 
import struct 
import array 

def all_interfaces(): 
    max_possible = 128 # arbitrary. raise if needed. 
    bytes = max_possible * 32 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    names = array.array('B', '\0' * bytes) 
    outbytes = struct.unpack('iL', fcntl.ioctl(
     s.fileno(), 
     0x8912, # SIOCGIFCONF 
     struct.pack('iL', bytes, names.buffer_info()[0]) 
    ))[0] 
    namestr = names.tostring() 
    return [namestr[i:i+32].split('\0', 1)[0] for i in range(0, outbytes, 32)] 
Questions connexes