Heim >Backend-Entwicklung >Golang >Wie liste ich Subnetze in einem Netzwerk mit Golang auf?

Wie liste ich Subnetze in einem Netzwerk mit Golang auf?

王林
王林nach vorne
2024-02-12 22:06:091493Durchsuche

如何使用 golang 列出网络中的子网?

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.

Frageninhalt

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/22192.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

Lösung

Die von mir geschriebene Funktion generiert alle Subnetze, die innerhalb eines bestimmten netcidr bei gegebener subnetmasksize erstellt werden können Code>. Netzwerke und Subnetze werden in der CIDR-Notation dargestellt. <p> </p>Zum Beispiel: <p> <pre class="brush:golang;toolbar:false;">func runner() { fmt.println(gensubnetsinnetwork(&quot;192.168.0.0/24&quot;, 26)) } </pre> <pre class="brush:bash;toolbar:false;">=== run testrunner/run_me [192.168.0.0/26 192.168.0.64/26 192.168.0.128/26 192.168.0.192/26] &lt;nil&gt; --- pass: testrunner (0.00s) </pre> </p>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. 🎜 <pre class="brush:golang;toolbar:false;">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(&quot;netCIDR is not a valid network address&quot;) } netMaskSize, _ := ipNet.Mask.Size() if netMaskSize &gt; int(subnetMaskSize) { return nil, errors.New(&quot;subnetMaskSize must be greater or equal than netMaskSize&quot;) } 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 &lt; int(totalSubnetsInNetwork); i++ { subnetIntAddresses[i] = subnetIntAddresses[i-1] + uint32(totalHostsInSubnet) } subnetCIDRs := make([]string, 0) for _, sia := range subnetIntAddresses { subnetCIDRs = append( subnetCIDRs, int2ip(sia).String()+&quot;/&quot;+strconv.Itoa(int(subnetMaskSize)), ) } return subnetCIDRs, nil } func ip2int(ip net.IP) uint32 { if len(ip) == 16 { panic(&quot;cannot convert IPv6 into uint32&quot;) } return binary.BigEndian.Uint32(ip) } func int2ip(nn uint32) net.IP { ip := make(net.IP, 4) binary.BigEndian.PutUint32(ip, nn) return ip } </pre>

Das 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen