我正在處理代碼,並嘗試添加ipv6支持。以下代碼位於當前用於ipv4支持的代碼庫中。該代碼需要一個ipv4 ip地址並獲取/ 32上地址的子網掩碼。從net.CIDRMask獲取ipv6子網掩碼
// 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'ing該文檔https://golang.org/pkg/net/#CIDRMask提及:
func CIDRMask(ones, bits int) IPMask
CIDRMask返回IPMask包括`那些1位,然後是0 高達`位的總長度位。對於這種形式的掩碼,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 } ]
謝謝!
'bits'是128 IPv6和32針對IPv4。對於'ones',這取決於,它不是100%清楚你想要做什麼。您是否試圖獲得代表1個單一IP的CIDR的子網掩碼?如果是這樣,那麼'ones'應該等於'bits'。而且,如果你總是用相同的兩對輸入來調用函數,爲什麼不先做一次呢? –
我想獲得一個IP地址的子網掩碼。讓我更加清楚......我認爲這就是代碼所做的事情。新手到golang :) – chrislovecnm
任何單個IPv4地址的子網掩碼將始終是您在第307行上看到的內容:https://golang.org/src/net/ip_test.go#L307。對於IPv6,它始終是您在第311行上看到的內容:https://golang.org/src/net/ip_test.go#L311。 –