我正在编写代码,并试图添加ipv6支持。下面的代码位于ipv4支持的当前代码库中。代码接受一个ipv4 ip地址,并为/32上的地址获取子网掩码。
// 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:
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提到:
func CIDRMask(ones, bits int) IPMaskCIDRMask返回由
ones' 1 bits followed by 0s up to a total length of位位组成的IPMask。对于这种形式的掩码,CIDRMask是IPMask.Size的反义词。
那么,我为ones和bits使用了哪些值?
这就是从api开始的内容:
$ 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 } ]提前感谢!
发布于 2015-11-20 04:16:37
我不知道PrefixLength是什么,它可能是在一个结构中定义的某个字段,但它似乎不是net包中任何内容的字段,实际上也不是标准库中的任何一个字段:https://golang.org/search?q=PrefixLength。
所以我不确定PrefixLength会给你什么,但是,我可以告诉你:
net.CIDRMask的bits参数的值应该是32。bits参数是128个。ones值为32或128,这取决于您是在谈论IPv4还是IPv6。因此,对于IPv4,您应该调用net.CIDRMask(32, 32),而对于IPv6,则调用net.CIDRMask(128, 128)。由于每次都是完全相同的计算,所以您可以选择直接将值设置为代码中的常量。正确的值是:
https://stackoverflow.com/questions/33769800
复制相似问题