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");
}
...

编译运行:

总结

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值