Der PHP-Editor Banana stellt Ihnen vor, wie Sie mit Golang Subnetze im Netzwerk auflisten. Golang ist eine leistungsstarke Programmiersprache, die viele Funktionen und Bibliotheken zur einfachen Bewältigung netzwerkbezogener Aufgaben bereitstellt. Um Subnetze in einem Netzwerk aufzulisten, können wir das Netzpaket und die CIDR-Bibliothek (Classless Inter-Domain Routing) von Golang verwenden. Durch das Parsen der IP-Adresse und der Subnetzmaske können wir alle Subnetze im Netzwerk berechnen. Als nächstes erklären wir im Detail, wie man mit Golang Code schreibt, um diese Funktion zu implementieren.
Ich möchte Nr. auflisten. Subnetz im Netzwerk, ich habe Beispielarbeitscode in Python, benötige ihn aber in Golang.
NETWORK="192.168.0.0/16" subnet_prefix=22 net = ipaddress.ip_network(NETWORK) for subnet in net.subnets(new_prefix=subnet_prefix): net = ipaddress.ip_interface(subnet) print(net)
192.168.0.0/22 192.168.4.0/22 192.168.8.0/22 192.168.16.0/22 192.168.20.0/22 192.168.24.0/22 192.16 8.28.0 /22 192.168.32.0/22 192.168.36.0/22 192.168.40.0/22 192.168.44.0/22 192.168.48.0/22 192.168.52.0/22 192.168.56.0/ 22 192.168.60.0/22 192.168.64. 0/22 192.168.68.0/22 192.168.72.0/22 192.168.76.0/22 192.168.80.0/22 192.168.88.0/22 192.168.92.0/22 192,1 68.96.0/ 22 192.168.100.0/22 192.168.0/22 192.168.108.0/22 192.168.112.0/22 192.168.120.0/22 192.168.128.0/ 22 192.168.13 2.0/22 192.168.136.0/22 192.168.140.0/22 192 . 168.144.0/22 192.168.148.0/22 192.168.152.0/22 192.168.156.0/22 192.168.164.0/22 192.168.168.0/22 192.168 .172.0/22. 192.1 68 .176.0/22 192.168.180.0/22 192. 168.184.0/22 192.168.188.0/22 192.168.192.0/22 192.168.196.0/22 192.168.204.0/22 192.168.208.0/22 192.168 .212.0/22. 192.1 68 .216.0/22 192.168.220.0/22 192. 168.224.0/22 192.168.228.0/22 192.168.232.0/22 192.168.236.0/22 192.168.240.0/22 192.168. 244.0/22 19 2.168.252.0/22
192.168.0.0/22 192.168.4.0/22 192.168.8.0/22 192.168.12.0/22 192.168.16.0/22 192.168.20.0/22 192.168.24.0/22 192.168 .28.0/22 192.168.32.0/22 192.168.36.0/22 192.168.40.0/22 192.168.44.0/22 192.168.48.0/22 192.168.52.0/22 192.168.56.0/22 192.168.60.0/22 192.168.64。 0/22 192.168.68.0/22 192.168.72.0/22 192.168.76.0/22 192.168.80.0/22 192.168.84.0/22 192.168.88.0/22 192.168.92.0/22 192.168.96.0/22 192.168.100.0/22 192.168.10 4.0/22 192.168.108.0/22 192.168.112.0/22 192.168.116.0/22 192.168.120.0/22 192.168.124.0/22 192.168.128.0/22 192.168.132.0/22 192.168.136.0/22 192.168.140.0/22 192。 168.144.0/22 192.168.148.0/22 192.168.152.0/22 192.168.156.0/22 192.168.160.0/22 192.168.164.0/22 192.168.168.0/22 192.168.172.0/22 192.168.176.0/22 192.168.180.0/22 192。 168.184.0/22 192.168.188.0/22 192.168.192.0/22 192.168.196.0/22 192.168.200.0/22 192.168.204.0/22 192.168.208.0/22 192.168.212.0/22 192.168.216.0/22 192.168.220.0/22 192. 168.224.0/22 192.168.228.0/22 192.168.232.0/22 192.168.236.0/22 192.168.240.0/22 192.168.244.0/22 192.168.248.0/22 192.168.252.0/22
我编写的函数生成给定 subnetmasksize
的所有子网,这些子网可以在给定 netcidr
netcidr
bei gegebener subnetmasksize erstellt werden können Code>. Netzwerke und Subnetze werden in der CIDR-Notation dargestellt.
Zum Beispiel:
func runner() {
fmt.println(gensubnetsinnetwork("192.168.0.0/24", 26))
}
Nach dem Login kopieren
=== run testrunner/run_me
[192.168.0.0/26 192.168.0.64/26 192.168.0.128/26 192.168.0.192/26] <nil>
--- pass: testrunner (0.00s)
Nach dem Login kopieren
Ich habe arithmetische Operationen gewählt, damit es einfacher zu verstehen ist (für eine bessere Leistung verwenden Sie bitweise Operationen). 🎜
🎜Diese Funktion berechnet einige Fakten zu einem bestimmten Netzwerk und einer bestimmten Subnetzmaske und generiert dann alle Subnetz-CIDRS. 🎜
func GenSubnetsInNetwork(netCIDR string, subnetMaskSize int) ([]string, error) {
ip, ipNet, err := net.ParseCIDR(netCIDR)
if err != nil {
return nil, err
}
if !ip.Equal(ipNet.IP) {
return nil, errors.New("netCIDR is not a valid network address")
}
netMaskSize, _ := ipNet.Mask.Size()
if netMaskSize > int(subnetMaskSize) {
return nil, errors.New("subnetMaskSize must be greater or equal than netMaskSize")
}
totalSubnetsInNetwork := math.Pow(2, float64(subnetMaskSize)-float64(netMaskSize))
totalHostsInSubnet := math.Pow(2, 32-float64(subnetMaskSize))
subnetIntAddresses := make([]uint32, int(totalSubnetsInNetwork))
// first subnet address is same as the network address
subnetIntAddresses[0] = ip2int(ip.To4())
for i := 1; i < int(totalSubnetsInNetwork); i++ {
subnetIntAddresses[i] = subnetIntAddresses[i-1] + uint32(totalHostsInSubnet)
}
subnetCIDRs := make([]string, 0)
for _, sia := range subnetIntAddresses {
subnetCIDRs = append(
subnetCIDRs,
int2ip(sia).String()+"/"+strconv.Itoa(int(subnetMaskSize)),
)
}
return subnetCIDRs, nil
}
func ip2int(ip net.IP) uint32 {
if len(ip) == 16 {
panic("cannot convert IPv6 into uint32")
}
return binary.BigEndian.Uint32(ip)
}
func int2ip(nn uint32) net.IP {
ip := make(net.IP, 4)
binary.BigEndian.PutUint32(ip, nn)
return ip
}
Nach dem Login kopierenDas obige ist der detaillierte Inhalt vonWie liste ich Subnetze in einem Netzwerk mit Golang auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!