C# 如何知道子网是否是更大网络的一部分

标签 c# networking ip

我正在使用互联网的 BGP 表(一个巨大的文件)。然而,路线汇总可能是一个问题。我的主要问题是,有时会公布大块 IPv4 空间(即 172.16.0.0/16),但也会公布更具体和更小的路由(即 172.16.64.0/18)。因此BGP表中有两个冗余条目。

我想找到一种方法来结束非冗余 IP 地址列表,只是大块。我正在考虑比较所有这些并将它们存储在一个列表中。 C# 中有没有一种方法可以知道 IP 地址是否是更广泛的 IP 地址的一部分?如:

172.16.64.0/18 是 172.16.0.0/16 的一部分//true

非常感谢您的帮助!

阿莱曼吉

最佳答案

使用简单的数学。

IP地址是4个字节,是一个32位整数。子网掩码完全相同。

鉴于此,您可以使用算术 AND 来确定它是在定义的网络内部还是外部。

EG:

IP: 192.168.0.1      = C0 . A8 . 00 . 01
Subnet: 192.168.0.0  = C0 . A8 . 00 . 00

Is in subnet?
Thus 0xC0A80001 & 0xC0A80000 == 0xC0A80000 => true

要回答一个网络是否存在于另一个网络中的问题,您可以使用相同的方法,但将两个数字右移为“最大”子网的大小。

EG:

Net A: 172.16.64.0/18 -> AC 10 40 00
Net B: 172.16.0.0/16  -> AC 10 00 00

Thus right shift both with 16 and apply previous op.

AC 10 & AC 10 == AC 10 -> true

关于C# 如何知道子网是否是更大网络的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279664/

相关文章:

linux - 是否可以检测本地 IP 地址并将其作为变量存储在 linux 脚本中

c# - 在 C# 中手动取消固定字节 []?

c# - 如何从库中查看函数内部

c# - 如何使用 C# 在 asp.net 中设置下拉列表值

c# - 使用 MVVMLight 将变量传递给第二个窗口?

php - 如何使用 php 获取域名的托管 IP 和国家/地区名称

algorithm - 如何计算网络中平均最短重量路径

java - 将公共(public) IP 地址与用户提供的网络掩码进行匹配

c++ - 在 Windows CE 7 上指定动态端口范围

ip - 使WAMP www在本地网络上可用