Powiel możliwe:
How can I check if an ip is in a network in pythonPython - ip <-> dopasowanie podsieci?
Co to prosty sposób, aby dopasować podsieć do adresu IP w Pythonie, tak, że jeśli adres IP jest w podsieci mogę ją wybrać?
Z góry dziękuję.
Powiel możliwe:
How can I check if an ip is in a network in pythonPython - ip <-> dopasowanie podsieci?
Co to prosty sposób, aby dopasować podsieć do adresu IP w Pythonie, tak, że jeśli adres IP jest w podsieci mogę ją wybrać?
Z góry dziękuję.
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
tak czy inaczej, aby to zrobić bardziej efektywnie dla ogromnego zestawu stołów? dawny. Mam tabelę około 100 000 z nich :) –
@ EiyrioüvonKauyf Zaktualizowano również odpowiedź na tę sprawę. – phihag
dziękuję bardzo :) –
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 :)
To naprawdę nie jest jasne, o co pytasz. Co wybierasz, adres IP lub podsieć? Czy jest pytanie "jak mogę sprawdzić, czy adres IP znajduje się w określonej podsieci?" Albo co? –