Cho một địa chỉ IP trong ký hiệu Quad chấm chấm, ví dụ: 192.192.45.1 và chiều dài mặt nạ cho ví dụ 8, 16, 24 thông thường, nhưng có thể là bất cứ điều gì tức là 17.
192.192.45.1
And a mask length for example 8, 16, 24 typically, but could be anything i.e. 17.
Ai đó có thể vui lòng cung cấp mã trong Python để tính toán mặt nạ mạng con không? Tốt nhất là tôi có thể nhận được kết quả là số nguyên 32 bit để băm dễ dàng và sau đó diễn giải lại dưới dạng chấm chấm khi cần thiết để in. Tôi thấy rằng Python có một thư viện ổ cắm về cơ bản là một trình bao bọc xung quanh API ổ cắm UNIX. Tôi cũng thấy nó có chức năng inet_ntoa [], nhưng nó trả về một số loại cấu trúc gói. Tôi không quen thuộc với thư viện Python Struct, vì vậy tôi đã hy vọng một số người khác sẽ có một số ý tưởng. Cảm ơn!
SMCI
30.8K18 Huy hiệu vàng110 Huy hiệu bạc145 Huy hiệu đồng18 gold badges110 silver badges145 bronze badges
Khi được hỏi ngày 9 tháng 5 năm 2012 lúc 1:00May 9, 2012 at 1:00
Themaestrothemaestrothemaestro
13.1K20 Huy hiệu vàng54 Huy hiệu bạc75 Huy hiệu đồng20 gold badges54 silver badges75 bronze badges
Cách đơn giản nhất là sử dụng mô -đun iPaddr của Google. Tôi giả sử mặt nạ 25 bit bên dưới, nhưng như bạn nói, nó có thể là bất cứ điều gì
Cho Python2
>>> # Use ipaddr in python 2.x
>>> import ipaddr
>>> mask = ipaddr.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
cho Python 3 ...
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
Mô -đun này khá hiệu quả trong việc thao tác các địa chỉ IPv4 và IPv6 ... một mẫu của một số chức năng khác trong đó ...
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
Đã trả lời ngày 9 tháng 5 năm 2012 lúc 1:04May 9, 2012 at 1:04
Mike Penningtonmike PenningtonMike Pennington
41.2K19 Huy hiệu vàng134 Huy hiệu bạc172 Huy hiệu đồng19 gold badges134 silver badges172 bronze badges
2
Bạn có thể tính toán giá trị 32 bit của mặt nạ như thế này
[1> import socket, struct
>>> mask_length = 24
>>> mask = [1> socket.inet_ntoa[struct.pack[">L", mask]]
'255.255.255.0'
Đã trả lời ngày 9 tháng 5 năm 2012 lúc 1:29May 9, 2012 at 1:29
John La Rooyjohn La RooyJohn La Rooy
Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges
Peter Moody
tác giảPeter Moody
Nick Coghlan
Tổng quan
Tài liệu này nhằm mục đích giới thiệu nhẹ nhàng cho mô -đun >>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5. Nó chủ yếu nhắm vào người dùng rằng aren đã quen thuộc với thuật ngữ mạng IP, nhưng cũng có thể hữu ích cho các kỹ sư mạng muốn có một cái nhìn tổng quan về cách >>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5 thể hiện các khái niệm giải quyết mạng IP.
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
Tạo địa chỉ/mạng/giao diện đối tượng
Vì >>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5 là một mô -đun để kiểm tra và thao tác các địa chỉ IP, điều đầu tiên bạn muốn làm là tạo một số đối tượng. Bạn có thể sử dụng >>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5 để tạo các đối tượng từ chuỗi và số nguyên.
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
Một ghi chú trên các phiên bản IP
Đối với những độc giả không đặc biệt quen thuộc với địa chỉ IP, điều quan trọng là phải biết rằng Giao thức Internet [IP] hiện đang trong quá trình chuyển từ phiên bản 4 của giao thức sang phiên bản 6. Chuyển đổi này xảy ra phần lớn do phiên bản 4 của Giao thức không cung cấp đủ địa chỉ để xử lý các nhu cầu của toàn thế giới, đặc biệt là với số lượng thiết bị ngày càng tăng có kết nối trực tiếp với Internet.
Giải thích các chi tiết về sự khác biệt giữa hai phiên bản của giao thức nằm ngoài phạm vi giới thiệu này, nhưng ít nhất người đọc cần phải biết rằng hai phiên bản này tồn tại và đôi khi sẽ cần phải sử dụng một phiên bản hoặc khác.
Địa chỉ máy chủ IP
>>> ipaddress.ip_address['192.0.2.1'] IPv4Address['192.0.2.1'] >>> ipaddress.ip_address['2001:DB8::1'] IPv6Address['2001:db8::1']
Địa chỉ cũng có thể được tạo trực tiếp từ các số nguyên. Các giá trị sẽ phù hợp trong vòng 32 bit được coi là địa chỉ IPv4:
>>> ipaddress.ip_address[3221225985] IPv4Address['192.0.2.1'] >>> ipaddress.ip_address[42540766411282592856903984951653826561] IPv6Address['2001:db8::1']
Để buộc sử dụng địa chỉ IPv4 hoặc IPv6, các lớp có liên quan có thể được gọi trực tiếp. Điều này đặc biệt hữu ích để buộc tạo địa chỉ IPv6 cho các số nguyên nhỏ:
>>> ipaddress.ip_address[1] IPv4Address['0.0.0.1'] >>> ipaddress.IPv4Address[1] IPv4Address['0.0.0.1'] >>> ipaddress.IPv6Address[1] IPv6Address['::1']
Xác định mạng
Địa chỉ máy chủ thường được nhóm lại với nhau thành các mạng IP, do đó
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5 cung cấp một cách để tạo, kiểm tra và thao tác các định nghĩa mạng. Các đối tượng mạng IP được xây dựng từ các chuỗi xác định phạm vi địa chỉ máy chủ là một phần của mạng đó. Hình thức đơn giản nhất cho thông tin đó là cặp tiền tố/tiền tố mạng của mạng, trong đó tiền tố xác định số lượng bit hàng đầu được so sánh để xác định xem địa chỉ có phải là một phần của mạng và địa chỉ mạng xác định giá trị dự kiến của những bit đó.Đối với các địa chỉ, một chức năng nhà máy được cung cấp tự động xác định phiên bản IP chính xác:
>>> ipaddress.ip_network['192.0.2.0/24'] IPv4Network['192.0.2.0/24'] >>> ipaddress.ip_network['2001:db8::0/96'] IPv6Network['2001:db8::/96']
Đối tượng mạng không thể có bất kỳ bộ bit máy chủ. Hiệu ứng thực tế của điều này là
[1 ipaddress.ip_network['192.0.2.1/24', strict=False]
IPv4Network['192.0.2.0/24']
Mặc dù biểu mẫu chuỗi cung cấp tính linh hoạt hơn đáng kể, các mạng cũng có thể được xác định với các số nguyên, giống như địa chỉ máy chủ. Trong trường hợp này, mạng được coi là chỉ chứa địa chỉ duy nhất được xác định bởi số nguyên, do đó, tiền tố mạng bao gồm toàn bộ địa chỉ mạng:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
0Như với các địa chỉ, việc tạo ra một loại mạng cụ thể có thể bị ép buộc bằng cách gọi trực tiếp cho hàm tạo lớp thay vì sử dụng chức năng nhà máy.
Giao diện máy chủ giao diện
Như đã đề cập ở trên, nếu bạn cần mô tả một địa chỉ trên một mạng cụ thể, cả địa chỉ và lớp mạng đều không đủ. Ký hiệu như
[1 mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5 cung cấp một bộ các lớp lai liên kết địa chỉ với mạng cụ thể. Giao diện để tạo giống hệt với xác định các đối tượng mạng, ngoại trừ phần địa chỉ không bị ràng buộc là một địa chỉ mạng.>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
1Đầu vào số nguyên được chấp nhận [như với các mạng] và việc sử dụng một phiên bản IP cụ thể có thể bị ép buộc bằng cách gọi trực tiếp cho hàm tạo có liên quan.
Kiểm tra địa chỉ/mạng/giao diện đối tượng
Bạn đã gặp rắc rối khi tạo đối tượng IPV [4 | 6] [địa chỉ | Mạng | Giao diện], vì vậy bạn có thể muốn có được thông tin về nó.
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5 cố gắng làm cho việc này dễ dàng và trực quan.Trích xuất phiên bản IP:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
2Lấy mạng từ giao diện:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
3Tìm hiểu có bao nhiêu địa chỉ riêng lẻ trong một mạng:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
4Lặp lại thông qua các địa chỉ có thể sử dụng được trên mạng trên mạng:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
5Có được netmask [nghĩa là đặt các bit tương ứng với tiền tố mạng] hoặc hostmask [bất kỳ bit nào không phải là một phần của netmask]:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
6Bùng nổ hoặc nén địa chỉ:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
7Mặc dù IPv4 không hỗ trợ vụ nổ hoặc nén, các đối tượng liên quan vẫn cung cấp các thuộc tính có liên quan để mã trung tính phiên bản có thể dễ dàng đảm bảo biểu mẫu ngắn gọn hoặc dài nhất được sử dụng cho địa chỉ IPv6 trong khi vẫn xử lý chính xác các địa chỉ IPv4.
Mạng như danh sách địa chỉ lor
Nó đôi khi hữu ích để coi các mạng như danh sách. Điều này có nghĩa là có thể lập chỉ mục chúng như thế này:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
8Điều đó cũng có nghĩa là các đối tượng mạng cho vay sử dụng cú pháp kiểm tra thành viên danh sách như thế này:
>>> # Use ipaddress in python 3.x
>>> import ipaddress
>>> mask = ipaddress.IPv4Network['192.192.45.1/25']
>>> mask.netmask
IPv4Address['255.255.255.128']
>>>
9Kiểm tra ngăn chặn được thực hiện hiệu quả dựa trên tiền tố mạng:
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
0So sánh lor
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
5 cung cấp một số cách đơn giản, hy vọng trực quan để so sánh các đối tượng, nơi nó có ý nghĩa:>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
1Một ngoại lệ
>>> import socket, struct
>>> mask_length = 24
>>> mask = [1> socket.inet_ntoa[struct.pack[">L", mask]]
'255.255.255.0'
0 được nêu ra nếu bạn cố gắng so sánh các đối tượng của các phiên bản khác nhau hoặc các loại khác nhau.Sử dụng địa chỉ IP với các mô -đun khác
Các mô -đun khác sử dụng địa chỉ IP [chẳng hạn như
>>> import socket, struct
>>> mask_length = 24
>>> mask = [1> socket.inet_ntoa[struct.pack[">L", mask]]
'255.255.255.0'
1] thường trực tiếp nhận các đối tượng chấp nhận từ mô -đun này. Thay vào đó, chúng phải bị ép buộc với một số nguyên hoặc chuỗi mà mô -đun khác sẽ chấp nhận:>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
2Nhận thêm chi tiết khi việc tạo ví dụ thất bại
Khi tạo các đối tượng địa chỉ/mạng/giao diện bằng các chức năng nhà máy không chính xác phiên bản, mọi lỗi sẽ được báo cáo là
[1> import socket, struct
>>> mask_length = 24
>>> mask = [1> socket.inet_ntoa[struct.pack[">L", mask]]
'255.255.255.0'
4 và >>> import socket, struct
>>> mask_length = 24
>>> mask = [1> socket.inet_ntoa[struct.pack[">L", mask]]
'255.255.255.0'
5 để chỉ ra chính xác phần nào của định nghĩa không thể phân tích chính xác.Các thông báo lỗi được chi tiết hơn đáng kể khi sử dụng trực tiếp các trình xây dựng lớp. Ví dụ:
>>> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
3Tuy nhiên, cả hai trường hợp ngoại lệ cụ thể của mô -đun đều có
[1> ## Subnet number?
>>> mask.network
IPv4Address['192.192.45.0']
>>>
>>> ## RFC 1918 space?
>>> mask.is_private
False
>>>
>> ## The subnet broadcast address
>>> mask.broadcast
IPv4Address['192.192.45.127']
>>> mask.iterhosts[]
4