zoukankan      html  css  js  c++  java
  • 根据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) ;
    }
     
     
     
  • 相关阅读:
    阿里云服务器的带宽计费问题
    命令行方式完成本地新建项目代码上传至git远程服务器仓库
    npm——web前端的maven
    vue-cli开发todoList
    vue开发环境搭建
    列表转树形结构
    内部类的创建
    C# 解析html 的工具库
    论亲密关系走向破碎的驱动力
    截图函数
  • 原文地址:https://www.cnblogs.com/wanhl/p/4976501.html
Copyright © 2011-2022 走看看