在网络中,CIDR /32
表示该地址只能用作网络地址本身,不能分配给任何主机。因此,在计算主机数量时,应将 CIDR 地址按照其位掩码长度进行区分。对于 /32
子网掩码,主机数量总是为 1,而不是 -1。
以下是修正后的代码,可以正确地处理 /32
CIDR 地址:
Go
package main
import (
"fmt"
"math"
"net"
)
func main() {
cidr := "10.22.2.1/32"
hostCount, err := calculateHostCount(cidr)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Number of hosts in %s: %d\n", cidr, hostCount)
}
func calculateHostCount(cidr string) (int, error) {
_, ipNet, err := net.ParseCIDR(cidr)
if err != nil {
return 0, err
}
maskLen, _ := ipNet.Mask.Size()
if maskLen == 32 {
return 1, nil
}
hostCount := int(math.Pow(2, float64(32-maskLen))) - 2
return hostCount, nil
}
通过添加了对 /32
子网掩码的特殊处理,现在代码会返回正确的主机数量 1,而不是 -1。