2012-03-15 20 views

Odpowiedz

16

W Pythonie 3.3+, można użyć ipaddress moduł:

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

Jeśli instalacja Pythona jest starsza niż 3.3, można użyć this backport.


Jeśli chcesz ocenić dużo adresów IP w ten sposób, prawdopodobnie będziesz chciał obliczyć maskę z góry, jak

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

Następnie, dla każdego adresu, obliczyć binarny reprezentacja jednego z

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 

Wreszcie, można łatwo sprawdzić:

in_network = (a & mask) == netw 
+0

tak czy inaczej, aby to zrobić bardziej efektywnie dla ogromnego zestawu stołów? dawny. Mam tabelę około 100 000 z nich :) –

+0

@ EiyrioüvonKauyf Zaktualizowano również odpowiedź na tę sprawę. – phihag

+0

dziękuję bardzo :) –

2

Jeśli dla danego adresu IP chcesz znaleźć prefiks z długiej listy prefiksów, możesz wdrożyć longest prefix match. Najpierw zbuduj prefix tree z listy prefiksów, a następnie przejdź przez drzewo, szukając najdalszego liścia, który pasuje do twojego prefiksu.

Brzmi strasznie, ale nie jest tak źle :)

Powiązane problemy