2012-03-15 10 views

risposta

16

In Python 3.3+, è possibile utilizzare ipaddress modulo:

>>> import ipaddress 
>>> ipaddress.ip_address('192.0.43.10') in ipaddress.ip_network('192.0.0.0/16') 
True 

Se l'installazione di Python è più vecchio di 3.3, è possibile utilizzare this backport.


Se si desidera valutare un sacco di indirizzi IP in questo modo, probabilmente si vorrà per calcolare la maschera di rete in anticipo, come

n = ipaddress.ip_network('192.0.0.0/16') 
netw = int(n.network_address) 
mask = int(n.netmask) 

Poi, per ogni indirizzo, calcolare il binario la rappresentazione di uno dei

a = int(ipaddress.ip_address('192.0.43.10')) 
a = struct.unpack('!I', socket.inet_pton(socket.AF_INET, '192.0.43.10'))[0] 
a = struct.unpack('!I', socket.inet_aton('192.0.43.10'))[0] # IPv4 only 

Infine, si può semplicemente controllare:

012.351.641,061 mila
+0

comunque per farlo in modo più efficiente per un gigantesco set di tavoli? ex. Ho una tabella di circa 100.000 di questi :) –

+0

@ EiyrioüvonKauyf Aggiornato anche la risposta per quel caso. – phihag

+0

grazie mille :) –

2

Se per un dato IP si desidera trovare un prefisso da un lungo elenco di prefissi, è possibile implementare longest prefix match. Per prima cosa crea un prefix tree dal tuo elenco di prefissi e, successivamente, attraversi l'albero alla ricerca della foglia più lontana che corrisponda al tuo prefisso.

Sembra spaventoso, ma non è poi così male :)

Problemi correlati