根据IP和掩码计算网段

一、需求

在写某个脚本时,需要用到使用该网段的任一地址,加上掩码位就可以计算出该网段所有的地址。再结合fping可以获取该网段内所有未被使用的地址。该需求实现时会涉及到各种计算,比较麻烦。所以先放G网上检索下有没有可以直接“拿来的”代码。找了几个代码,必须都是先给出第一个IP ,再加上掩码位才能计算出所有的IP,如果取中间的IP就不灵了。后来找了一段大牛写的C代码,发现比较好用,刚好符合要求。

二、代码及需求实现

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
static void ip_mask(char *net, int *netmask) {
        char *p;
        if ((p = strchr(net, '/')) != NULL)
                *p = '\0';
        *netmask = atoi(p+1);
}
static void dton(u_int32_t mask, u_int32_t *netmask) {
        u_int32_t i, c;
        int bits = sizeof(u_int32_t) * 8;
        i = ~0;
        bits -= mask;
        i = i << bits;
        *netmask = htonl(i);
}
int main(int argc, char **argv) {
        int err = 0;
        char ip[32] = {0};
        u_int32_t mask, netmask;
        struct in_addr ipadd, subnet, broadcast;
        if (argc >= 2) {
                strncpy(ip, argv[1], sizeof(ip)-1);
        } else {
                fprintf(stderr, "Usage: %s <ip/mask>\n", argv[0]);
                exit(1);
        }
        ip_mask(ip, &mask);
        if (!(err = inet_aton(ip, &ipadd))) {
                fprintf(stderr, "IP type error!\n");
                exit(2);
        }
        if (mask > 32 || mask < 1) {
                fprintf(stderr, "Mask is out of range!\n");
                exit(3);
        }
        dton(mask, &netmask);
        subnet.s_addr = ipadd.s_addr & netmask;
        broadcast.s_addr = ~ (subnet.s_addr ^ netmask);
        printf ("%s - ", inet_ntoa(subnet));
        printf ("%s\n", inet_ntoa(broadcast));
        return 0;
}

代码保存为net2ip.c ,编译运行,结果如下:

[root@361way ~]# gcc net2ip.c -o net2ip
[root@361way ~]# ./net2ip 192.168.1.100/24
192.168.1.0 - 192.168.1.25

使用fping -g可以对一个网段进行ping并获取到未被使用的地址,不过fping使用的网段不要中间的“-” ,C代码略作作改,再编译下。最络实现的结果如下:

[root@361way ~]# fping -g $(echo `./netip  10.211.89.229/26`)|grep 'unreachable'
10.211.89.196 is unreachable
10.211.89.197 is unreachable
10.211.89.198 is unreachable
10.211.89.201 is unreachable
10.211.89.202 is unreachable
10.211.89.205 is unreachable




本站的发展离不开您的资助,金额随意,欢迎来赏!

分类: C/C++/Java/Delphi 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.