一、需求
在写某个脚本时,需要用到使用该网段的任一地址,加上掩码位就可以计算出该网段所有的地址。再结合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 = ' '; *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> ", argv[0]); exit(1); } ip_mask(ip, &mask); if (!(err = inet_aton(ip, &ipadd))) { fprintf(stderr, "IP type error! "); exit(2); } if (mask > 32 || mask < 1) { fprintf(stderr, "Mask is out of range! "); 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 ", 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
根据IP和掩码计算网段,首发于运维之路。
转载请注明:我是IT » 根据IP和掩码计算网段