Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyenaraikan subnet dalam rangkaian menggunakan golang?

Bagaimana untuk menyenaraikan subnet dalam rangkaian menggunakan golang?

王林
王林ke hadapan
2024-02-12 22:06:091345semak imbas

如何使用 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)

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 kod>. Rangkaian dan subnet diwakili dalam tatatanda cidr. <p> </p>Contohnya: <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>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. 🎜 <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>

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam