从 net.CIDRMask 获取 ipv6 子网掩码

我正在编写代码,并尝试添加 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的单元测试位于此处:https : //golang.org/src/net/ip_test.go


但这超出了我的 golang 经验和 ipv6 知识。


RTFM 在文档https://golang.org/pkg/net/#CIDRMask 中提到:


func CIDRMask(ones, bits int) IPMask

CIDRMask 返回一个 IPMask,它由“个”1 位后跟 0 组成,直到总长度为“位”位。对于这种形式的掩码,CIDRMask 是 IPMask.Size 的倒数。


那么我对onesand使用什么值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   } ]

提前致谢!


犯罪嫌疑人X
浏览 179回答 1
1回答

慕容森

我不确定是什么PrefixLength,它可能是您的一个结构中定义的某个字段,但它似乎不是net包中任何内容的字段,或者实际上是标准库中的任何地方:https://golang .org/search?q=PrefixLength。所以我不确定PrefixLength预期会给予什么,但是,我可以告诉你:IPv4 地址由 32 位数据组成(总共 256 x 256 x 256 x 256 个 IP),因此在处理 IPv4 时,bits参数 to的值net.CIDRMask应为 32。IPv4 地址有 128 位数据,因此bits参数为 128。对应于单个 IP 的 CIDR 范围的子网掩码将具有最大数量,因此该ones值是 32 或 128,具体取决于您是在谈论 IPv4 还是 IPv6。因此,对于 IPv4,您应该调用net.CIDRMask(32, 32),对于 IPv6,应该调用net.CIDRMask(128, 128)。由于这些每次都是完全相同的计算,因此您可以选择在代码中将值预先设置为常量。正确的值是:对于 IPv4:https : //golang.org/src/net/ip_test.go#L307对于 IPv6:https : //golang.org/src/net/ip_test.go#L311
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go