2013-04-29 11 views
5

in questo momento faccio:affidabile ottenere indirizzi IPV6 in Python

def get_inet_ip(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s.connect(('mysite.com', 80)) 
    return s.getsockname()[0] 

Questa era basata su: Finding local IP addresses using Python's stdlib

Tuttavia, questo sembra un po 'dubbioso. Per quanto ne so, apre un socket su mysite.com:80, quindi restituisce il primo indirizzo per quel socket, assumendo che si tratti di un indirizzo IPv4. Questo sembra un po 'dubbia ... non penso che potremo mai garantire che sia così.

Questa è la mia prima domanda, è sicuro? Su un server abilitato IPv6, l'indirizzo IPv6 potrebbe mai essere restituito in modo imprevisto?

La seconda domanda è come ottenere l'indirizzo IPv6 in modo simile. Im andando a modificare la funzione di prendere un parametro opzionale ipv6.

+0

Questo non è un metodo affidabile per IPv4 . –

+0

Sì, pensavo di no. Per favore spiega meglio. –

risposta

1

si dovrebbe utilizzare la funzione socket.getaddrinfo()

codice di esempio per ottenere IPv6

def get_ip_6(host,port=80): 
    # discard the (family, socktype, proto, canonname) part of the tuple 
    # and make sure the ips are unique 
    alladdr = list(
     set(
      map(
       lambda x: x[4], 
       socket.getaddrinfo(host,port) 
      ) 
     ) 
    ) 
    ip6 = filter(
     lambda x: ':' in x[0], # means its ip6 
     alladdr 
    ) 
    return ip6 
+0

Troverò meglio il filtro per il campo della famiglia di indirizzi del risultato, non per la rappresentazione in testo dell'indirizzo restituito. Vedi la mia risposta. – glglgl

+0

Lambdas etc ... funzionerà in 2.4? Doveva essere compatibile. –

+0

@glglgl Sì hai ragione, era solo un esempio veloce e sporco. Il punto era principalmente di reindirizzare la documentazione a socket.getaddrinfo(). – katharas

6

La domanda è, vuoi solo per la connessione, o si vuole veramente l'indirizzo?

Se si desidera solo per la connessione, si può fare

s = socket.create_connection(('mysite.com', 80)) 

e hanno la connessione stabilita.

Tuttavia, se siete interessati a l'indirizzo, si può andare uno dei seguenti modi:

def get_ip_6(host, port=0): 
    import socket 
    # search only for the wanted v6 addresses 
    result = socket.getaddrinfo(host, port, socket.AF_INET6) 
    return result # or: 
    return result[0][4][0] # just returns the first answer and only the address 

o, per essere più vicini a another, already presented solution:

def get_ip_6(host, port=0): 
    # search for all addresses, but take only the v6 ones 
    alladdr = socket.getaddrinfo(host,port) 
    ip6 = filter(
     lambda x: x[0] == socket.AF_INET6, # means its ip6 
     alladdr 
    ) 
    # if you want just the sockaddr 
    # return map(lambda x:x[4],ip6) 
    return list(ip6)[0][4][0] 
+0

Sì, voglio l'IP, il suo andare in un file di configurazione. –

Problemi correlati