2012-03-15 27 views
7

thể trùng lặp:
How can I check if an ip is in a network in pythonPython - ip <-> kết nối mạng con?

một cách dễ dàng để phù hợp với subnet đến một địa chỉ ip trong python là gì, do đó nếu địa chỉ ip là trong subnet tôi có thể chọn nó?

Xin cảm ơn trước.

+1

Nó thực sự không rõ ràng những gì bạn đang yêu cầu. Bạn đang chọn gì, IP hoặc mạng con? Câu hỏi là "làm cách nào để biết địa chỉ IP có nằm trong mạng con cụ thể không?" Hay cái gì? –

Trả lời

16

Trong Python 3.3+, bạn có thể sử dụng mô-đun ipaddress:

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

Nếu cài đặt Python của bạn cũ hơn 3.3, bạn có thể sử dụng this backport.


Nếu bạn muốn đánh giá rất nhiều địa chỉ IP theo cách này, có thể bạn sẽ muốn tính toán netmask trả trước, giống như

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

Sau đó, đối với mỗi địa chỉ, tính toán nhị phân đại diện với một trong những

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 

Cuối cùng, bạn chỉ có thể kiểm tra:

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

anyway để làm điều này hiệu quả hơn cho một tập hợp khổng lồ của bảng? ví dụ Tôi có một bảng khoảng 100.000 trong số này :) –

+0

@ EiyrioüvonKauyf Cập nhật câu trả lời cho trường hợp đó. – phihag

+0

cảm ơn bạn rất nhiều :) –

2

Nếu cho một IP cụ thể bạn muốn tìm tiền tố từ danh sách dài tiền tố, thì bạn có thể triển khai longest prefix match. Trước tiên, bạn tạo một mã số prefix tree từ danh sách tiền tố của mình và sau đó, bạn duyệt qua cây tìm kiếm lá xa nhất khớp với tiền tố của bạn.

Nghe có vẻ đáng sợ, nhưng nó không phải là xấu :)

Các vấn đề liên quan