3 回答

TA貢獻1802條經驗 獲得超5個贊
將 CIDR 地址和網絡掩碼轉換為 uint32。找到開始和結束,然后在 uint32 上循環以獲取地址
package main
import (
"encoding/binary"
"fmt"
"log"
"net"
)
func main() {
// convert string to IPNet struct
_, ipv4Net, err := net.ParseCIDR("192.168.255.128/25")
if err != nil {
log.Fatal(err)
}
// convert IPNet struct mask and address to uint32
// network is BigEndian
mask := binary.BigEndian.Uint32(ipv4Net.Mask)
start := binary.BigEndian.Uint32(ipv4Net.IP)
// find the final address
finish := (start & mask) | (mask ^ 0xffffffff)
// loop through addresses as uint32
for i := start; i <= finish; i++ {
// convert back to net.IP
ip := make(net.IP, 4)
binary.BigEndian.PutUint32(ip, i)
fmt.Println(ip)
}
}
https://play.golang.org/p/5Yq0kXNnjYx

TA貢獻1810條經驗 獲得超4個贊
我在這個線程中找到了一種基于https://play.golang.org/p/fe-F2k6prlA by adam-hanna 的方法 - https://gist.github.com/kotakanbe/d3059af990252ba89a82
package main
import (
"fmt"
"log"
"net"
"time"
)
func Hosts(cidr string) ([]string, int, error) {
ip, ipnet, err := net.ParseCIDR(cidr)
if err != nil {
return nil, 0, err
}
var ips []string
for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {
ips = append(ips, ip.String())
}
// remove network address and broadcast address
lenIPs := len(ips)
switch {
case lenIPs < 2:
return ips, lenIPs, nil
default:
return ips[1 : len(ips)-1], lenIPs - 2, nil
}
}
func inc(ip net.IP) {
for j := len(ip) - 1; j >= 0; j-- {
ip[j]++
if ip[j] > 0 {
break
}
}
}
func main() {
ips, count, err := Hosts("8.8.8.0/24")
if err != nil {
log.Fatal(err)
}
for n := 0; n <= count; n += 8 {
fmt.Println(ips[n])
}
}
- 3 回答
- 0 關注
- 164 瀏覽
添加回答
舉報