(摘) Golang获取网段内所有IP

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

通过网关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)
	}
}

相关文章