根据Ip地址与掩码 得出 子网地址与广播地址

    由于给予条件优先,没有直接给出子网地址与广播地址。但是又需要这两个参数,需要我们使用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) ;
}

 

 
 
 
posted @ 2015-11-19 08:49  wanhl  阅读(1316)  评论(0编辑  收藏  举报