ipv6 判断地址是否在同一个子网

 

代码应该可以调试通,源码是在github上找的,做了些修改。

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>

#include <sys/socket.h>   
  
#include <arpa/inet.h>   
#include <string.h> 


typedef struct {  
    uint16_t x[8];
} ip6_t;
typedef struct 
{  
    int prefixlen;  
    ip6_t address;  
    ip6_t mask;
} net6_t;

int intnet6_include_p(net6_t net, ip6_t a) 
{  
    for (int i=0; i<8; i++) {    
        if ((net.address.x[i] & net.mask.x[i]) != (a.x[i] & net.mask.x[i])) 
            return 0;  
    }  
    return 1;

}
ip6_t ip6_tmk_mask6(int prefixlen) 
{  ip6_t mask;  uint16_t ones = ~((uint16_t) 0);  
    int pivot = prefixlen / 16;  
    int shift = 16 - (prefixlen % 16); 
    for (int i=0; i<pivot && i<8; i++) {    
        mask.x[i] = ones;  }  
        if (pivot<8) {    mask.x[pivot] = (ones >> shift) << shift;  } 
        for (int i = pivot+1; i<8; i++) {    
            mask.x[i] = 0;  
            }  
        return mask;

}
static ip6_t
mk_mask6(int prefixlen) {
  ip6_t mask;
  uint16_t ones = ~((uint16_t) 0);

  int pivot = prefixlen / 16;
  int shift = 16 - (prefixlen % 16);

  for (int i=0; i<pivot && i<8; i++) {
    mask.x[i] = ones;
  }
  if (pivot<8) {
    mask.x[pivot] = (ones >> shift) << shift;
  }
  for (int i = pivot+1; i<8; i++) {
    mask.x[i] = 0;
  }

  return mask;
}

net6_t br_net;
ip6_t br_ip;
int create_ip6(struct in6_addr br)
{
    int i;    
    for(i = 0; i < 8; i++) {       
        br_ip.x[i] = ntohs(br.s6_addr16[i]);// big_little     
    } 
    return 0;
}
int create_net6( struct in6_addr br, int prefix)
{   
        int i;    
    for(i = 0; i < 8; i++) {       
        br_net.address.x[i] = ntohs(br.s6_addr16[i]);// big_little     
    } 
    br_net.prefixlen = prefix;     
    br_net.mask = mk_mask6(prefix);
}
int main(void) 
{     printf("test\n");
struct in6_addr v6_1, v6_2;
int j;
    char *str_1 = "2000:1234::1";
    char *str_2 = "2000:1231::675:7365:262f:65a:bcd";
    inet_pton(AF_INET6, str_1, &v6_1);
    inet_pton(AF_INET6, str_2, &v6_2);
    printf("ipv6_1: \n ");
    for(j = 0; j < 8; j++) {
        printf("%04x ", v6_1.s6_addr16[j]);
    }
    printf("\n ipv6_2: \n ");
    for(j = 0; j < 8; j++) {
        printf("%04x ", v6_2.s6_addr16[j]);
    }
    printf(" \n ");
    //create_net6(v6_1, 64);
    create_net6(v6_1, 28);
    create_ip6(v6_2);
    printf("br_net: \n ");
    for(j = 0; j < 8; j++) {
        printf("%04x ", br_net.address.x[j]);
    }
    printf("\n ipv_net: \n ");
    for(j = 0; j < 8; j++) {
        printf("%04x ", br_ip.x[j]);
    }
    printf(" \n ");
    printf("result: %d\n", intnet6_include_p(br_net, br_ip));
        
    
    return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值