代码应该可以调试通,源码是在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;
}