为了账号安全,请及时绑定邮箱和手机立即绑定

从 net.CIDRMask 获取 ipv6 子网掩码

从 net.CIDRMask 获取 ipv6 子网掩码

Go
犯罪嫌疑人X 2021-11-22 17:46:50
我正在编写代码,并尝试添加 ipv6 支持。以下代码位于当前支持 ipv4 的代码库中。该代码采用 ipv4 ip 地址并获取 /32 上地址的子网掩码。// string of ip addressnetworkInterface["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) IPMaskCIDRMask 返回一个 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   } ]提前致谢!
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

我不确定是什么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)。由于这些每次都是完全相同的计算,因此您可以选择在代码中将值预先设置为常量。正确的值是:


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信