package main import ( "bufio" "log" "net" "os" "strconv" "strings" ) // 根据子网掩码获取主机数量 func getCidrHostNum(maskLen int) int { cidrIPNum := int(0) if maskLen < 32 { var i int = int(32 - maskLen - 1) for ; i >= 1; i-- { cidrIPNum += 1 << i } cidrIPNum += 2 } else { cidrIPNum = 1 } if cidrIPNum > 255 { cidrIPNum = 255 } return cidrIPNum } // 获取 IP 最后一段最小值和最大值 func getCidrIPRange(cidr string) (uint8, uint8) { ip := strings.Split(cidr, "/")[0] ipSegs := strings.Split(ip, ".") maskLen, _ := strconv.Atoi(strings.Split(cidr, "/")[1]) seg4MinIP, seg4MaxIP := getIPSeg4Range(ipSegs, maskLen) //ipPrefix := ipSegs[0] + "." + ipSegs[1] + "." + ipSegs[2] + "." return seg4MinIP, seg4MaxIP } // 获取 IP 最后一段的区间 func getIPSeg4Range(ipSegs []string, maskLen int) (uint8, uint8) { ipSeg, _ := strconv.Atoi(ipSegs[3]) return getIPSegRange(uint8(ipSeg), uint8(32-maskLen)) } // 根据输入的基础IP地址和CIDR掩码计算一个IP片段的区间 func getIPSegRange(userSegIP, offset uint8) (uint8, uint8) { var ipSegMax uint8 = 255 netSegIP := ipSegMax << offset segMinIP := netSegIP & userSegIP segMaxIP := userSegIP&(255<