Maison > développement back-end > Golang > Comment lister les sous-réseaux d'un réseau à l'aide de Golang ?

Comment lister les sous-réseaux d'un réseau à l'aide de Golang ?

王林
Libérer: 2024-02-12 22:06:09
avant
1428 Les gens l'ont consulté

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

l'éditeur php Banana vous présentera comment utiliser Golang pour lister les sous-réseaux du réseau. Golang est un langage de programmation puissant qui fournit de nombreuses fonctionnalités et bibliothèques pour gérer facilement les tâches liées au réseau. Pour répertorier les sous-réseaux d'un réseau, nous pouvons utiliser le package net de Golang et la bibliothèque CIDR (Classless Inter-Domain Routing). En analysant l'adresse IP et le masque de sous-réseau, nous pouvons calculer tous les sous-réseaux du réseau. Ensuite, nous expliquerons en détail comment utiliser Golang pour écrire du code permettant d'implémenter cette fonction.

Contenu de la question

Je veux lister le numéro. sous-réseau en réseau, j'ai un exemple de code de travail en python mais j'en ai besoin en 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)
Copier après la connexion

192.168.0.0/22 ​​​​192.168.4.0/22 ​​​​192.168.12.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.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.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.16 8 .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.16 8 .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

Solution

La fonction que j'ai écrite génère tous les sous-réseaux qui peuvent être créés dans un netcidr donné avec un subnetmasksize. Les réseaux et sous-réseaux sont représentés en notation cidr.

Par exemple :

func runner() {
    fmt.println(gensubnetsinnetwork("192.168.0.0/24", 26))
}
Copier après la connexion
=== 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)
Copier après la connexion

J'ai choisi les opérations arithmétiques pour que ce soit plus facile à comprendre (pour de meilleures performances, utilisez des opérations au niveau du bit). 🎜 🎜Cette fonction calcule certains faits sur un réseau et un masque de sous-réseau donnés, puis génère tous les cidrs de sous-réseau. 🎜
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
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal