用Python开发一个交互式网络和IP地址计算器
# 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()
上一篇
下一篇