Golang学习之C段转IP

香烟,氲成一摊光圈,和他的照片就摆在手边,傻傻两个人笑得多甜。——《阴天》

想用Go写一个端口扫描的工具,然后发现没有像Python一样有现成的库可以实现C段转IP的功能。

Python

如果用Python写,是这样的。

1
2
3
4
import ipaddress

ips = ipaddress.ip_network("192.168.30.0/24")
list(ips)

此时就可以拿到对应的IP列表了。

Go

如果用go写,就是这样子的,虽然也有解析库,但是emmmm。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
func cidr2IPs(cidr string) []string {
// C段转ip
var ips []string

ipAddr, ipNet, err := net.ParseCIDR(cidr)
if err != nil {
log.Print(err)
}

for ip := ipAddr.Mask(ipNet.Mask); ipNet.Contains(ip); increment(ip) {
ips = append(ips, ip.String())
}

// CIDR too small eg. /31
if len(ips) <= 2 {
log.Print("err")
}

return ips
}

func increment(ip net.IP) {
for i := len(ip) - 1; i >= 0; i-- {
ip[i]++
if ip[i] != 0 {
break
}
}
}

日常感慨

Python真香!