通过网关IP和掩码,获取本网段所有IP。通过“通义千问”搜索出来的不靠谱。
package main
import (
"fmt"
"net"
)
// 获取同网段所有 IP 地址
func getIPsInRange(ipAddr string, subnetMask string) ([]string, error) {
ip := net.ParseIP(ipAddr)
mask := net.IPMask(net.ParseIP(subnetMask).To4())
// 获取 IP 地址所在的网络
_, ipNet, err := net.ParseCIDR(fmt.Sprintf("%s/%d", ip, countBits(mask)))
if err != nil {
return nil, err
}
// 遍历网络中的 IP 地址
ips := []string{}
for {
ip = ip_inc(ip)
if ipNet.Contains(ip) == false {
break
}
ips = append(ips, ip.String())
}
return ips, nil
}
// 计算子网掩码中的位数
func countBits(mask net.IPMask) int {
count := 0
for _, b := range mask {
for b > 0 {
b &= (b - 1)
count++
}
}
return count
}
// IP地址加1的操作
func ip_inc(ip net.IP) net.IP {
for j := len(ip) - 1; j >= 0; j-- {
ip[j]++
if ip[j] > 0 {
break
}
}
return ip
}
func main() {
ip := "192.168.8.0"
mask := "255.255.255.0"
ips, err := getIPsInRange(ip, mask)
if err != nil {
fmt.Println("Error:", err)
return
}
for _, ipStr := range ips {
fmt.Println(ipStr)
}
}