# coding=utf-8
import sys
try:
while True: # 判断用户输入的IP是否符合规范,如果不规范则while循环反复询问,直到用户输入正确IP地址为止。
ip_address = input("输入要查询的IP地址: ")
ip_octets = ip_address.split('.') # 将IP地址用split()转换成列表,该列表有4个元素,分别代表用户输入的IP地址的4个8位字段。
# 0.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16以及Class D这些保留IP地址均不是有效的IP
if (len(ip_octets) == 4) and (1 <= int(ip_octets[0]) <= 223) and (int(ip_octets[0]) != 127) and (
int(ip_octets[0]) != 169 or int(ip_octets[1]) != 254) and (
0 <= int(ip_octets[1]) <= 255 and 0 <= int(ip_octets[2]) <= 255 and 0 <= int(ip_octets[3]) <= 255):
break
else:
print("\n不是有效的IP地址,请重新输入\n")
continue
masks = [255, 254, 252, 248, 240, 224, 192, 128, 0] # 将所有有效的子网掩码的十进制数字归纳进一个列表,用于验证用户输入的子网掩码是否合乎规范
while True: # 判断用户输入的子网掩码是否符合规范,如果不规范则while循环反复询问,直到用户输入正确子网掩码为止。
subnet_mask = input("输入子网掩码: ")
mask_octets = subnet_mask.split('.') # 将子网掩码用split()转换成列表,该列表有4个元素,分别代表用户输入的子网掩码的4个8位字段。
# 支持/0 - /32所有子网掩码
if (len(mask_octets) == 4) and (int(mask_octets[0]) in masks) and (int(mask_octets[1]) in masks) and (
int(mask_octets[2]) in masks) and (int(mask_octets[3]) in masks) and (
int(mask_octets[0]) >= int(mask_octets[1]) >= int(mask_octets[2]) >= int(mask_octets[3])):
break
else:
print("\n不是有效的子网掩码,请重新输入\n")
continue
mask_octets_binary = []
for octet in mask_octets:
binary_octet = bin(int(octet)).lstrip('0b')
# print(binary_octet)
mask_octets_binary.append(binary_octet.zfill(8))
# print(mask_octets_binary)
binary_mask = "".join(mask_octets_binary)
# print(decimal_mask)
no_of_zeros = binary_mask.count("0")
no_of_ones = 32 - no_of_zeros
no_of_hosts = abs(2 ** no_of_zeros - 2) # 当掩码为/32时,2的0次方减1等于-1,需要用abs()函数将其转换成正数1.
# print(no_of_zeros)
# print(no_of_ones)
# print(no_of_hosts)
wildcard_octets = []
for octet in mask_octets:
wild_octet = 255 - int(octet)
wildcard_octets.append(str(wild_octet))
# print(wildcard_octets)
wildcard_mask = ".".join(wildcard_octets)
# print(wildcard_mask)
ip_octets_binary = []
for octet in ip_octets:
binary_octet = bin(int(octet)).lstrip('0b')
# print(binary_octet)
ip_octets_binary.append(binary_octet.zfill(8))
# print(ip_octets_binary)
binary_ip = "".join(ip_octets_binary)
# print(binary_ip)
network_address_binary = binary_ip[:(no_of_ones)] + "0" * no_of_zeros
# print(network_address_binary)
broadcast_address_binary = binary_ip[:(no_of_ones)] + "1" * no_of_zeros
# print(broadcast_address_binary)
net_ip_octets = []
for bit in range(0, 32, 8):
net_ip_octet = network_address_binary[bit: bit + 8]
net_ip_octets.append(net_ip_octet)
# print(net_ip_octets)
net_ip_address = []
for each_octet in net_ip_octets:
net_ip_address.append(str(int(each_octet, 2)))
# print(net_ip_address)
network_address = ".".join(net_ip_address)
# print(network_address)
bst_ip_octets = []
for bit in range(0, 32, 8):
bst_ip_octet = broadcast_address_binary[bit: bit + 8]
bst_ip_octets.append(bst_ip_octet)
# print(bst_ip_octets)
bst_ip_address = []
for each_octet in bst_ip_octets:
bst_ip_address.append(str(int(each_octet, 2)))
# print(bst_ip_address)
broadcast_address = ".".join(bst_ip_address)
# print(broadcast_address)
print("\n")
print("该网段的网络地址为: %s" % network_address)
print("该网段的广播地址为: %s" % broadcast_address)
print("该网段可用的IP地址数量为: %s" % no_of_hosts)
print("反掩码: %s" % wildcard_mask)
print("掩码位: %s" % no_of_ones)
print("\n")
print(input())
except KeyboardInterrupt:
print("\n\n程序终止\n")
sys.exit()