由于给予条件优先,没有直接给出子网地址与广播地址。但是又需要这两个参数,需要我们使用ip 地址与 子网掩码得出子网地址与广播地址。思路如下:
1. 子网地址, ip地址与 子网掩码分别换算成二进制, 两者相与,那么即得出 该子网地址。 如:
192.168.1.1 255.255.255.0 子网地址为192.168.1.0 , 换算成二进制数字, 算法如下。
01100000 01010100 00000001 00000001 (192.168.1.1)&
11111111 11111111 11111111 00000000 (255.255.255.0) =
1100000 1010100 00000001 00000000 即为192.168.1.0 。
下面是 该算法的C 代码。使用inet_aton 函数, 将字符串形式的ip地址、子网掩码,转换成网络字节序(unin32_t , 即整形),然后对两个数字进行相与, 之后再使用inet_ntoa 函数,将网络字节序形式的ip地址,转换回 点分十进制式的ip地址。
char *getSubnet(char ip[], char netmask[]) { struct in_addr addr; struct in_addr mask ; struct in_addr subnet ; if(inet_aton(ip, &addr) == 0) { perror("inet_aton error"); return NULL; } if(inet_aton(netmask, &mask) == 0) { perror("inet_aton error"); return NULL; } subnet.s_addr = addr.s_addr & mask.s_addr ; return inet_ntoa(subnet) ; }
2. 对于子网中的广播地址, 计算的形式,与子网地址是一样的,就是需要对算法进行调整一下。 首先我们对子网掩码进行取反操作, 得到一个新值,然后使用该值与ip地址进行 “或”操作。即得到子网中的广播地址。
再拿192.168.1.1 与 255.255.255.0 做例子,
1111111 1111111 11111111 00000000 ~ = 00000000 00000000 00000000 11111111
00000000 00000000 00000000 11111111 |
01100000 01010100 00000001 00000001 =
01100000 01010100 00000001 11111111 == 192.168.1.255
代码如下:
char *getBroadIp(char ip[], char netmask[]) { struct in_addr addr; struct in_addr mask ; struct in_addr broadIp ; if(inet_aton(ip, &addr) == 0) { perror("inet_aton error"); return NULL; } if(inet_aton(netmask, &mask) == 0) { perror("inet_aton error"); return NULL; } broadIp.s_addr = addr.s_addr | (~mask.s_addr) ; return inet_ntoa(broadIp) ; }