gpt4 book ai didi

go - 搜索一个网络是否包含在另一个网络中的功能

转载 作者:行者123 更新时间:2023-12-01 22:17:51 25 4
gpt4 key购买 nike

在Go中,我需要一种有效的方法来采用一个CIDR网络并测试它是否完全包含在其他网络中。

例:

var (
subnet string = "10.10.10.8/29"
route string = "10.10.10.0/24"
)

我想测试“子网”是否在“路由”中,并返回true,因为它在其中。对于不在“route”之内或部分不在“route”内的值,返回false。

我有一个解决方案,可以使用IP / CIDR解析和包net中的“x.Contains()”来测试网络中是否有单个主机。我尝试将其调整为适用于网络,但失败了。

无效:
if route.Contains(subnet) {
fmt.Println("%s subnet is contained subnet %s",net, route)
}

编辑:显然对此有些困惑。此段上方的代码段对我来说无法测试一个网络是否在另一个网络内。 SO溢出准则要求我具体说明我尝试过的内容,因此才将其放在此处。这是我的第一篇SO帖子。

我有一些想法比我想做的要大:

使用“net.ParseCIDR()”和已知子网大小作为常量,计算“子网”的第一个IP(网络IP)和最后一个IP(广播IP),然后测试“子网”的网络IP和广播IP是否都在带有“x.Contains()”的“路线”中。

编辑:我在最初的搜索中没有看到此线程,但现在遇到了。这是相似的,所以我在这里链接以确保完整性。 [ How to detect if two Golang net.IPNet objects intersect?]

最佳答案

对于任何xy IPv4,以及从0到32的任何整数mn,当且仅当x/my/nm >= n中时,网络x才包含在y/n中(您可以自己为此证明)。因此,以下将起作用:

func contains(subnet, route string) (bool, error) {
sIP, sNW, err := net.ParseCIDR(subnet)
if err != nil {
return false, err
}

_, rNW, err := net.ParseCIDR(route)
if err != nil {
return false, err
}

sNWMaskSize, _ := sNW.Mask.Size()
rNWMaskSize, _ := rNW.Mask.Size()

return rNW.Contains(sIP) && sNWMaskSize >= rNWMaskSize, nil
}

关于go - 搜索一个网络是否包含在另一个网络中的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58154051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com