给出的IP地址和子网掩码时,如何计算IP范围?(How to calculate the IP ra

2019-07-19 07:34发布

当一个IP范围都被写成一个aaa.bbb.ccc.ddd /掩码( CIDR表示法 ),我需要计算的第一个和最后在这个范围内使用C#包括IP地址。

例:

输入:192.168.0.1/25

结果:192.168.0.1 - 192.168.0.126

Answer 1:

我的好朋友亚历山德罗有一个不错的职位关于C#位运算符,您应该了解它,所以你知道该怎么做。

这是很容易的 。 如果你打破给你二进制的IP,网络地址是IP地址,所有的主机位(0的子网掩码)为0,而最后一个地址,广播地址,是所有主机位都为1。

例如:

ip 192.168.33.72 mask 255.255.255.192

11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)

粗体的部分是主机位(其余是网络比特)。 如果你把所有的主机位为0的IP,你得到的第一个可能的IP:

11000000.10101000.00100001.01000000 (192.168.33.64)

如果你把所有的主机位为1级的,那么你得到的最后可能的IP(又名广播地址):

11000000.10101000.00100001.01111111 (192.168.33.127)

因此,对于我的例子:

the network is "192.168.33.64/26":
Network address: 192.168.33.64
First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice)
Last useable: 192.168.33.126
Broadcast address: 192.168.33.127


Answer 2:

我只是张贴代码:

IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 });
int bits = 25;

uint mask = ~(uint.MaxValue >> bits);

// Convert the IP address to bytes.
byte[] ipBytes = ip.GetAddressBytes();

// BitConverter gives bytes in opposite order to GetAddressBytes().
byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray();

byte[] startIPBytes = new byte[ipBytes.Length];
byte[] endIPBytes = new byte[ipBytes.Length];

// Calculate the bytes of the start and end IP addresses.
for (int i = 0; i < ipBytes.Length; i++)
{
    startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]);
    endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]);
}

// Convert the bytes to IP addresses.
IPAddress startIP = new IPAddress(startIPBytes);
IPAddress endIP = new IPAddress(endIPBytes);


Answer 3:

反掩码(XOR用的),并将其与IP。 添加1.这将是起点范围。 或IP,掩码。 这将是结束范围。



Answer 4:

我从网络部署位置的工作得知这个快捷方式。 它帮助了我这么多,我想我会分享这个秘密跟大家。 到目前为止,我还没有能够找到一个更简单的方法在网上,我知道的。

例如网络192.115.103.64 / 27,什么范围内?

只记得子网掩码为0,128,192,224,240,248,252,254,255

255.255.255.255 11111111.11111111.11111111.11111111 / 32

255.255.255.254 11111111.11111111.11111111.11111110 / 31

255.255.255.252 11111111.11111111.11111111.11111100 / 30

255.255.255.248 11111111.11111111.11111111.11111000 / 29

255.255.255.240 11111111.11111111.11111111.11110000 / 28

255.255.255.224 11111111.11111111.11111111.11100000 / 27

255.255.255.192 11111111.11111111.11111111.11000000 / 26

255.255.255.128 11111111.11111111.11111111.10000000 / 25

255.255.255.0 11111111.11111111.11111111.00000000 / 24

从/ 27,我们知道(11111111.11111111.11111111.11100000)。 从左边算起,它是从最后一个八位字节,其等于255.255.255.224子网掩码的第三数目。 (不要指望0,0是/ 24),从而128,192 224..etc

在这些地方数学进来:

使用子网掩码 - 子网掩码先前列出的子网掩码的在这种情况下224-192 = 32

我们知道192.115.103.64是网络:64 + 32 = 96(对于/ 27的下一个网络)

这意味着我们有0.0 0.32。 64. 96. 128. 160. 192. 224.(不能使用256,因为它是.255)

下面是范围为64 - 96。

网络是64。

第一主机是65(第一网络1)

最后一台主机是94(-1广播)

广播是95(最后一个网络-1)



Answer 5:

您可能已经知道这一点,但检查你得到这个东西右看看http://www.subnet-calculator.com/ -你可以看到有位如何表示地址的网络和主机部分。



Answer 6:

我知道这是一个老问题,但我发现,似乎为我做的一种技巧上的NuGet这个漂亮的图书馆:

http://nuget.org/packages/TakeIo.NetworkAddress/



Answer 7:

我会建议使用IPNetwork图书馆https://github.com/lduchosal/ipnetwork 。 作为第2版,它支持IPv4和IPv6,以及。

IPv4的

  IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25");

  Console.WriteLine("Network : {0}", ipnetwork.Network);
  Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
  Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
  Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
  Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
  Console.WriteLine("Usable : {0}", ipnetwork.Usable);
  Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);

产量

  Network : 192.168.0.0
  Netmask : 255.255.255.128
  Broadcast : 192.168.0.127
  FirstUsable : 192.168.0.1
  LastUsable : 192.168.0.126
  Usable : 126
  Cidr : 25

玩得开心 !



Answer 8:

输入: 192.168.0.1/25

掩模是这一部分: /25

要查找网络地址做到以下几点:

  • 减去从IP长度掩模(32 - 掩模)= 32 - 25 = 7,从右侧把这些位

  • 在给定的IP地址,即: 192.168.0.1以二进制为: 11111111 11111111 00000000 00000001现在,用7位右“0” 1111111 11111111 00000000 00000000哪个十进制就是: 192.168.0.0 (这是网络地址)

为了找到第一个有效的/可用的IP地址添加+1到网络地址即: 192.168.0.1

找到最后/广播地址的程序是一样的,找到网络地址,但在这里,你必须做出从右到“1”(32屏蔽)位

即: 11111111 11111111 00000000 01111111哪个十进制是192.168.0.127

为了找到最后一个有效的/可用的IP地址从广播地址即减去1: 192.168.0.126



文章来源: How to calculate the IP range when the IP address and the netmask is given?
标签: c# ip netmask