• Linux下ipcalc命令详解及C/C++实现(计算主机的IP信息)


    如果你有时会发现自己在处理IPv4/IPV6网络时挠头,那么ipcalc可能就是你要找的工具。在Linux上,ipcalc具有更多的网络技能。 它首先收集IP地址和NetMask等数据,然后输出所得的广播,网络等信息。

    ipcalc命令

    ipcalc命令是一个简单的ip地址计算器,可以完成简单的IP地址计算任务。下面通过man ipcalc查看详细使用。

    用法:

    ipcalc [OPTION]… [/prefix] [netmask]


    或者使用 ipcalc -h ,前提是你得先安装ipcalc命令(yum install ipcalc)。

    在这里插入图片描述

    从帮助信息来看,ipcalc命令支持如下的功能:

    多种类型的位图作为输出。
    地址信息是从接口中检索的。
    根据DNS分辨率显示定向的主机名。
    输出表示为压缩和标准。
    输入地址也表示为压缩和标准。
    输出格式,例如多个地址和NetMask。
    用户定义的其他网络数量为输出。
    IPv6标准网络输出。

    ipcalc示例

    • 校验IP地址

    如果校验不通过就提示ipcalc: bad IPv4 …,正确就什么都不输出。注意只是校验IP地址的格式是否正确

    • 显示广播地址


    计算广播地址需要输入IP地址和掩码。

    • 显示网络掩码


    计算地址掩码需要输入IP地址及网络地址位数,如果未输入网络地址位数则按照A/B/C/D/E类地址进行计算掩码。

    • 计算网络地址

    可以给定IP和网络掩码计算网络地址

    • 给定IP显示对应的主机名

    查看IP地址对应主机名实际上市查找/etc/hosts文件

    • 计算给定掩码的前缀

    • 组合选项

    我们可以看出计算给定IP的网络掩码,广播地址,网络地址。

    ipcalc命令简单实现

    ...
    int main(int argc, char ** argv)
    {
    
        if(argc < 2)
        {
            usage(argv[0], "You must provide a valid ip/mask");
        }
    
        int inputSize = get_input_size(argv[1]);
    
        if (inputSize > 18)
        {
            usage(argv[0], "You must provide a valid ip/mask");
        }
    
        int numberOfSlashes = get_number_of_slashes(argv[1]);
    
        if (numberOfSlashes != 1)
        {
            usage(argv[0], "You must provide a valid ip/mask");
        }
    
        int slashPosition = get_slash_position(argv[1]);
    
        if (slashPosition == 0 || slashPosition == inputSize - 1)
        {
            usage(argv[0], "You must provide a valid ip/mask");
        }
    
        get_ip_string(argv[1], ip_string, slashPosition);
    
        if (!is_valid_ip_address(ip_string))
        {
            usage(argv[0], "You must provide a valid ip/mask");
        }
    
        get_mask_string(argv[1], mask_string, slashPosition);
    
        if (!is_valid_mask(mask_string))
        {
            usage(argv[0], "You must provide a valid ip/mask");
        }
    
        printf("\n");
        printf("Entry: %s\n", argv[1]);
        printf("\n");
    
        handle_input(argv[1]);
    
        network_address = ip_number & mask_number;
        broadcast = ~(mask_number);
        broadcast = broadcast + network_address;
        host_min = network_address + 1;
        host_max = broadcast - 1;
    
        // printing the results
        printf("Network address: ");
        printf("\t");
        binary_print(network_address);
        printf("\t");
        print_ip_address(&network_address);
        printf("\n");
    
        printf("Netmask:          ");
        printf("\t");
        binary_print(mask_number);
        printf("\t");
        print_ip_address(&mask_number);
        printf("(%d bits)", number_of_mask_bits);
        printf("\n");
    
        printf("Broadcast addr:   ");
        printf("\t");
        binary_print(broadcast);
        printf("\t");
        print_ip_address(&broadcast);
        printf("\n");
    
        printf("Min Host value:   ");
        printf("\t");
        binary_print(host_min);
        printf("\t");
        print_ip_address(&host_min);
        printf("\n");
    
        printf("Max Host value:   ");
        printf("\t");
        binary_print(host_max);
        printf("\t");
        print_ip_address(&host_max);
        printf("\n");
        printf("\n");
    
        number_of_hosts_bits = 32 - number_of_mask_bits;
    
        printf("The possible number of hosts on this network is %d.\n", (int)pow(2, number_of_hosts_bits) - 2);
        printf("\n");
    }
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    编译运行:

    总结

    在本文中,了解了ipcalc工具以及在这些示例中使用它的步骤。 它是与网络相关任务的重要工具。
    提供了一种计算主机IP信息的简单方法。可以完成简单的IP地址计算任务。各种选项指定ipcalc应该在标准输出上显示什么信息。

    欢迎关注微信公众号【程序猿编码】,需要 ipcalc命令完整源码的添加本人微信号(c17865354792)

  • 相关阅读:
    四、vue-cli 介绍与使用
    20.1CubeMx配置FMC控制SDRAM【W9825G6KH-6】
    C++学习 --文件
    考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化(Matlab代码实现)
    面试之Java String 编码相关
    SQL Server创建用户并且为用户授权
    使用datagrip复制表到另外一个数据库
    Docker与K8S
    leetcode:802. 找到最终的安全状态【反图 + 入度统计 + deque + 找出图中非环的节点】
    java计算机毕业设计在线学习跟踪系统后台源程序+mysql+系统+lw文档+远程调试
  • 原文地址:https://blog.csdn.net/chen1415886044/article/details/126087367