ipv4-ipv6-mask

来源:互联网 发布:淘宝怎么买伟哥 编辑:程序博客网 时间:2024/06/07 03:00


ipv4是2的4次方,32位数据,42亿多个
ipv6是2的6次方,128位数据,很多很多个


ip地址的表示方式
字符串一般为点分十进制表示,又有ip地址,ip段,ip掩码方式


192.168.1.1
192.168.1.100-192.168.1.200
192.168.1.1/24
192.168.1.1 255.255.255.0
当然掩码方式也是ip段的一种表示,需要通过计算获得
掩码是为了表示主机号和网络号,可以找出是否在一个ip段,和广播地址


大小端问题
一般x86都是小端,网络字节序和有些别的cpu会有大端
大于8位也就是大于一个字节的数据,就有存放的问题


4个字节的数据,0X 01020304 ,就有高低字节之分而地址就有高低地址之分
如何存放呢?肯定是两种,高字节在高地址,高字节在低地址
小端就是高字节在低地址,内存中就是 04 03 02 01
大端就是高字节在高地址,内存中就是 01 02 03 04
存放顺序不同,那么解读就肯定不同,小端的数据到了大端,数据就变了


ip地址的转换和比较


点分字符串-网络字节序
inet_pton(AF_INET,ip,&(in));
inet_pton(AF_INET6,ip,&(in6));
网络字节序-点分字符串
inet_ntop(AF_INET,&(in),name,NAME_LEN);
inet_ntop(AF_INET6,&(in6),name,NAME_LEN);
大小端转换,网络-主机
ip.addr4 = ntohl(ip.addr4);
ip.addr128 = ntoh128(ip.addr128);
掩码-ip段范围
ipv4
static __u32 mask_int_calc(int mask_len)
{
    __u32 mask = 0;
    int loop = 0;


    for (loop = 0; loop < mask_len; loop++){
        mask |= 1 << (31 - loop);
    }
    return mask;
}
addr4 = addr4 & mask_int_calc(mask));
addr4 = (addr4 | (~(mask_int_calc(mask) & 0xffffffff)));


ipv6

static void mask_min(struct in6_addr *addr,int mask_len)
{
__u32 half = 0;
int loop = 0;


if(mask_len%8){
addr->s6_addr[mask_len/8] &= ((char)0xff) << (8-mask_len%8);
half = 1;
}
for (loop = mask_len/8+half; loop < 16; loop++){
   addr->s6_addr[loop] = 0;
}
}


static void mask_max(struct in6_addr *addr, int mask_len)
{
__u32 half = 0;
int loop = 0;


if(mask_len%8){
addr->s6_addr[mask_len/8] |= ((char)0xff);
half = 1;
}
for (loop = mask_len/8+half; loop < 16; loop++){
   addr->s6_addr[loop] = 0xff;
}
}


比较直接采用memcmp
原创粉丝点击