Wie liste ich Subnetze in einem Netzwerk mit Golang auf?

王林
Freigeben: 2024-02-12 22:06:09
nach vorne
1188 Leute haben es durchsucht

如何使用 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)
Nach dem Login kopieren

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. 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 kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!