已知网络地址和子网掩码
def subnetting(part): # 子网划分
n = network_num - part * 8 # 借了n个网络位
if n < 0:
print("暂不支持超网划分")
else:
subnet = 2 ** n # 子网个数
terminal_num = 2 ** (8 - n)
print("可划分子网数为:{}".format(subnet))
times = 0
for i in range(subnet):
times += 1
ip_start = [i for i in ip]
network_address = [i for i in ip]
ip_start[3] += 1
print("第{:}个网段地址范围为:{:15} 至 ".format(times, ".".join(map(str, list(ip_start)))), end="")
ip[part] += terminal_num - 1
for i in range(3, part, -1):
ip[i] += 255
ip_end = [i for i in ip]
broadcast_address = [i for i in ip]
ip_end[3] -= 1
print("{:19}网络地址:{:19}广播地址:{:}".format(".".join(map(str, list(ip_end))),
".".join(map(str, list(network_address))),
".".join(map(str, list(broadcast_address)))))
ip[part] += 1
for i in range(3, part, -1):
ip[i] -= 255
print("每个子网主机数为:{}".format(2 ** host_num - 2))
while True:
try:
ip = list(map(int, input("请输入网络地址:").split("."))) # 列表型10进制IP
if 224 <= ip[0] <= 239:
print("D类地址")
continue
elif 240 <= ip[0] <= 255:
print("E类地址")
continue
elif ip[0] == 127:
print("回环地址")
continue
else:
netmask = list(map(int, input("请输入子网掩码:").split("."))) # 列表型10进制子网掩码
except ValueError: # 字母型非法地址
print("非法地址!")
else:
ip_bin = list(map(lambda x: '{:0>8}'.format(x[2:]), list(map(bin, ip)))) # 列表型二进制IP
netmask_bin = list(map(lambda x: '{:0>8}'.format(x[2:]), list(map(bin, netmask)))) # 列表型二进制子网掩码
IP_bin = "".join(ip_bin) # 字符串型二进制IP
NETMASK_bin = "".join(netmask_bin) # 字符串型二进制子网掩码
network_num = 0 # 网络号位数
for i in NETMASK_bin:
if int(i) == 1:
network_num += 1
else:
break
host_num = 32 - network_num # 主机号位数
if len(ip) != 4 or len(netmask) != 4:
print("非法地址!") # 长度型非法地址
elif any(i > 255 or i < 0 for i in ip + netmask):
print("非法地址!") # 范围型非法地址
elif any(int(i) == 1 for i in IP_bin[network_num:]):
print("非法地址!") # 非网络地址
else: # 地址类型判断
if 0 <= ip[0] <= 126:
print("A类地址")
subnetting(1) # 子网划分
elif 128 <= ip[0] <= 191:
print("B类地址")
subnetting(2) # 子网划分
elif 192 <= ip[0] <= 223:
print("C类地址")
subnetting(3) # 子网划分
else:
print("非法地址")
网友评论