子网划分(python程序)

2023-01-24  本文已影响0人  lzj01231

已知网络地址和子网掩码

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("非法地址")
上一篇 下一篇

猜你喜欢

热点阅读