Bagaimana untuk menyenaraikan subnet dalam rangkaian menggunakan golang?

王林
Lepaskan: 2024-02-12 22:06:09
ke hadapan
1188 orang telah melayarinya

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

editor php Banana akan memperkenalkan anda cara menggunakan Golang untuk menyenaraikan subnet dalam rangkaian. Golang ialah bahasa pengaturcaraan berkuasa yang menyediakan banyak ciri dan perpustakaan untuk mengendalikan tugas berkaitan rangkaian dengan mudah. Untuk menyenaraikan subnet dalam rangkaian, kami boleh menggunakan pakej bersih Golang dan pustaka CIDR (Penghalaan Antara Domain Tanpa Kelas). Dengan menghuraikan alamat IP dan subnet mask, kita boleh mengira semua subnet dalam rangkaian. Seterusnya, kami akan menerangkan secara terperinci cara menggunakan Golang untuk menulis kod bagi melaksanakan fungsi ini.

Isi soalan

Saya nak senaraikan no. subnet dalam rangkaian, saya mempunyai contoh kod kerja dalam python tetapi memerlukannya dalam 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)
Salin selepas log masuk

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.028.24 192.028.24 /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.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.028.92 22 192.168.100.0/22 ​​192.168. 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.160.0/22 ​​192.168.152.0/22 ​​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.192.0/22 ​​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 ​​6.236.0/2 6 248.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

Penyelesaian

Fungsi yang saya tulis menjana semua subnet yang boleh dibuat dalam netcidr diberikan subnetmasksize. Rangkaian dan subnet diwakili dalam tatatanda cidr.

Contohnya:

func runner() {
    fmt.println(gensubnetsinnetwork("192.168.0.0/24", 26))
}
Salin selepas log masuk
=== 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)
Salin selepas log masuk

Saya memilih operasi aritmetik supaya lebih mudah difahami (untuk prestasi yang lebih baik, gunakan operasi bitwise). 🎜 🎜Fungsi ini mengira beberapa fakta tentang rangkaian tertentu dan topeng subnet, kemudian menjana semua cidr subnet. 🎜
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
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk menyenaraikan subnet dalam rangkaian menggunakan golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!