如何在给出IP地址和网络掩码时计算IP范围?

Anh*_*dir 36 c# ip netmask

当IP范围写为aaa.bbb.ccc.ddd/netmask(CIDR表示法)时,我需要使用C#计算此范围内的第一个和最后一个包含的IP地址.

例:

输入: 192.168.0.1/25

结果: 192.168.0.1 - 192.168.0.126

bal*_*dre 61

我的好朋友Alessandro在C#中有关于位操作符的好帖子,你应该阅读它以便你知道该怎么做.

这很容易.如果将分配给您的IP分解为二进制,则网络地址是所有主机位(子网掩码中的0)为0的IP地址,最后一个地址(广播地址)是所有主机的位置位是1.

例如:

ip 192.168.33.72 mask 255.255.255.192

11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)
Run Code Online (Sandbox Code Playgroud)

粗体部分是HOST位(其余部分是网络位).如果在IP上将所有主机位都设置为0,则会获得第一个可能的IP:

11000000.10101000.00100001.01000000 (192.168.33.64)
Run Code Online (Sandbox Code Playgroud)

如果您将所有主机位转为1,那么您将获得最后一个可能的IP(即广播地址):

11000000.10101000.00100001.01111111 (192.168.33.127)
Run Code Online (Sandbox Code Playgroud)

所以我的例子:

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
Run Code Online (Sandbox Code Playgroud)


Jor*_*ren 26

我只是发布代码:

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);
Run Code Online (Sandbox Code Playgroud)

  • 我建议改用mask = IPAddress.NetworkToHostOrder(mask). (3认同)

Vla*_*sny 8

反转掩码(XOR与1),与IP一起使用.添加1.这将是起始范围.或带掩码的IP.这将是结束范围.


Jam*_* Ye 8

我从网络部署位置开始学习这个快捷方式.它对我帮助很大,我想我会和大家分享这个秘密.到目前为止,我无法在网上找到更简单的方法.

例如网络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 ......等

这里数学的来源:

使用子网掩码 - 在此情况下上一个列出的子网掩码的子网掩码224-192 = 32

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

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

这是范围64 - 96.

网络是64.

第一个主机是65.(第一个网络+1)

最后一位主持人是94.(广播-1)

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


Luk*_*ker 5

我会推荐使用 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);
Run Code Online (Sandbox Code Playgroud)

输出

  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
Run Code Online (Sandbox Code Playgroud)

玩得开心 !