首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ipv6中获取net.CIDRMask子网掩码

从ipv6中获取net.CIDRMask子网掩码
EN

Stack Overflow用户
提问于 2015-11-18 00:37:06
回答 1查看 1.6K关注 0票数 0

我正在编写代码,并试图添加ipv6支持。下面的代码位于ipv4支持的当前代码库中。代码接受一个ipv4 ip地址,并为/32上的地址获取子网掩码。

代码语言:javascript
复制
// string of ip address
networkInterface["ip_address"] = v.IpAddress[0]
m := net.CIDRMask(v.IpConfig.IpAddress[0].PrefixLength, 32)
subnetMask := net.IPv4(m[0], m[1], m[2], m[3])
networkInterface["subnet_mask"] = subnetMask.String()

我知道net.CIDRMask与ipv6一起工作,我不知道如何将它与ipv6地址一起使用。

我现在正在测试ip地址,以确定地址是ipv4还是ipv6:

代码语言:javascript
复制
testInput := net.ParseIP(v.IpAddress[0])
if testInput.To4() != nil {
// find ipv4 subnet mask
}
if testInput.To16() != nil {
// do ipv6 subnet mask
}

net.CIDRMask的单元测试有使用ipv6的示例,位于以下位置:test.go

但这不是我的黄金经验和ipv6的知识。

当RTFM‘the docs https://golang.org/pkg/net/#CIDRMask提到:

代码语言:javascript
复制
func CIDRMask(ones, bits int) IPMask

CIDRMask返回由ones' 1 bits followed by 0s up to a total length of位位组成的IPMask。对于这种形式的掩码,CIDRMask是IPMask.Size的反义词。

那么,我为onesbits使用了哪些值?

这就是从api开始的内容:

代码语言:javascript
复制
$ govc vm.info -json vcsa | jq .VirtualMachines[0].Guest.Net[0].IpConfig.IpAddress [   {
    "IpAddress": "10.20.128.218",
    "PrefixLength": 22,
    "Origin": "",
    "State": "preferred",
    "Lifetime": null   } ]

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 04:16:37

我不知道PrefixLength是什么,它可能是在一个结构中定义的某个字段,但它似乎不是net包中任何内容的字段,实际上也不是标准库中的任何一个字段:https://golang.org/search?q=PrefixLength

所以我不确定PrefixLength会给你什么,但是,我可以告诉你:

  • IPv4地址由32位数据(256个×256个总IP)组成,因此在处理IPv4时,net.CIDRMaskbits参数的值应该是32。
  • IPv4地址有128个数据位,所以bits参数是128个。
  • 对应于单个IP的CIDR范围的子网掩码将具有最大数量,因此ones值为32或128,这取决于您是在谈论IPv4还是IPv6。

因此,对于IPv4,您应该调用net.CIDRMask(32, 32),而对于IPv6,则调用net.CIDRMask(128, 128)。由于每次都是完全相同的计算,所以您可以选择直接将值设置为代码中的常量。正确的值是:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33769800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档