1.判断ipv4 or ipv6
func CheckIp ( ip string ) int {
if ip == "" {
return 4
}
out := net. ParseIP ( ip)
if out == nil {
return 0
}
if strings. Contains ( out. String ( ) , "." ) {
return 4
}
if strings. Contains ( out. String ( ) , ":" ) {
return 6
}
return 0
}
2.计算cidr格式ip所含IP个数
func CountIPs ( cidr string ) ( int64 , error ) {
_ , ipNet, err := net. ParseCIDR ( cidr)
if err != nil {
return 0 , err
}
mask := ipNet. Mask
ones, bits := mask. Size ( )
numIPs := int64 ( 1 << uint ( bits- ones) )
return numIPs, err
}
3.计算两个ip区间所含ip个数
func ipToInt ( ip net. IP) int64 {
ip = ip. To4 ( )
if ip == nil {
return 0
}
ipParts := strings. Split ( ip. String ( ) , "." )
ipInt := int64 ( 0 )
for i := 0 ; i < 4 ; i++ {
part, _ := strconv. ParseInt ( ipParts[ i] , 10 , 64 )
ipInt += part << ( ( 3 - uint ( i) ) * 8 )
}
return ipInt
}
func main ( ) {
startIP := "183.62.142.241"
endIP := "183.62.145.233"
start := net. ParseIP ( startIP)
if start == nil {
log. Fatal ( "Invalid start IP address" )
}
end := net. ParseIP ( endIP)
if end == nil {
log. Fatal ( "Invalid end IP address" )
}
startInt := ipToInt ( start)
endInt := ipToInt ( end)
count := endInt - startInt + 1
fmt. Printf ( "Number of IPs between %s and %s: %d\n" , startIP, endIP, count)
}