我需要在in_addr / in6_addr结构中存储IP地址/网络掩码.
对于IPv4,我使用以下代码来测试网络掩码是否是连续的:
((((~netmask + 1) & (~netmask)) != 0) && (netmask != 0))
我想知道是否有一种聪明的方法可以为IPv6做同样的事情.
最佳答案 我遇到了以下解决方案:
将IPV6字节拆分为四个32位的块,并按以下方式创建三个部分:
uint64_t netmask1, netmask2, netmask3;
netmask1 = (netmask.s6_addr32[0] << 32) + in6_netmask.s6_addr32[1];
netmask2 = (netmask.s6_addr32[1] << 32) + in6_netmask.s6_addr32[2];
netmask3 = (netmask.s6_addr32[2] << 32) + in6_netmask.s6_addr32[3];
如果其中一个部分不连续,则网络掩码不是连续的.
if ((((~address1 + 1) & (~address1)) != 0) ||
(((~address2 + 1) & (~address2)) != 0) ||
((~address3 + 1) & (~address3)) != 0))) {
// Netmask is not valid!
}