gpt4 book ai didi

c++ - 是否有按位和 ipv6 地址和网络掩码(前缀)的代码?

转载 作者:可可西里 更新时间:2023-11-01 16:40:04 31 4
gpt4 key购买 nike

想问一下ipv6网络和主机端的计算

例如,我有 IPv6 地址 2001:470:1f15:1bcd:34::41 和前缀 96

你知道在 IPv6 地址和前缀之间按位 的简单方法吗?

根据 IPv4:

192.168.1.2  255.255.255.0  network : 192.168.1.0

很简单。

我想对 IPv6 地址做同样的事情。但是 IPv6 地址是 16 个字节,所以你不能为此使用 unsigned int

是否有任何 API 可以执行此操作?还是应该使用数组?

最佳答案

好的,我是用 C 而不是 C++ 做的,但它应该可以工作。此外,它使用 bswap_64这是 AFAIK 的 GNU 扩展,因此可能不适用于所有情况。

它似乎在 amd64 上非常快,并且比 Yasar 提出的当前解决方案更快:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#include <arpa/inet.h>

#if defined __GNUC__ && __GNUC__ >= 2
#include <byteswap.h>
#else
#error "Sorry, you need GNU for this"
#endif

struct split
{
uint64_t start;
uint64_t end;
};

void ipv6_prefix (unsigned char *masked, unsigned char *packed, int prefix)
{
struct split parts;
uint64_t mask = 0;
unsigned char *p = masked;

memset(masked, 0, sizeof(struct in6_addr));
memcpy(&parts, packed, sizeof(parts));

if (prefix <= 64)
{
mask = bswap_64(bswap_64(parts.start) & ((uint64_t) (~0) << (64 - prefix)));
memcpy(masked, &mask, sizeof(uint64_t));
return;
}

prefix -= 64;

memcpy(masked, &(parts.start), sizeof(uint64_t));
p += sizeof(uint64_t);
mask = bswap_64(bswap_64(parts.end) & (uint64_t) (~0) << (64 - prefix));
memcpy(p, &mask, sizeof(uint64_t));
}

int main (int argc, char **argv)
{
unsigned char packed[sizeof(struct in6_addr)];
unsigned char masked[sizeof(struct in6_addr)];
char buf[INET6_ADDRSTRLEN], *p;
int prefix = 56;

if (argc < 2)
return 1;

if ((p = strchr(argv[1], '/')))
{
*p++ = '\0';
prefix = atoi(p);
}

inet_pton(AF_INET6, argv[1], packed);

ipv6_prefix(masked, packed, prefix);

inet_ntop(AF_INET6, masked, buf, INET6_ADDRSTRLEN);
printf("prefix = %s/%d\n", buf, prefix);
return 0;
}

关于c++ - 是否有按位和 ipv6 地址和网络掩码(前缀)的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158528/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com