子网划分(python程序)

已知网络地址和子网掩码

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("非法地址")
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值