c# - 从 IP 地址开始和 IP 地址计数生成 IP 范围

标签 c# networking

所以我在网上看到了很多例子,这些例子展示了如果你知道起始 IP 和结束 IP 如何获得完整的 IP,但我需要的是在提供后告诉我完整的 IP 范围带有起始 IP 和所需 IP 地址数的代码。

因此,例如,如果我提供 192.168.0.1 的 IP 地址作为起始 IP 以及 60 个 IP 所需的 IP 数量,结果应该返回

StartIP = 192.168.0.1
EndIP = 192.168.0.61
IPCount = 60

我看过 IPNetwork 库,但这需要使用我们没有使用的 CIDR。

编辑:

我试过的是以下内容。

我已经尝试过 IPNetwork,当使用它时它需要 CIDR 如上所述,我们没有使用 CIDR,所以这对我没有好处。

我想到了最基本的方法,就是把最后一个八位字节加到那个数字上,所以如果最后一个八位字节是 2,IP 的数量是 60,那么新的最后一个八位字节是 62。这很简单,但是当最后一个八位位组大约是 200,需要的 IP 数量是 70,我们不能只添加到最后一个八位位组,因为最后一个八位位组最终会得到 270,因为你不能超过 255,所以有一个问题. 现在如何计算该 IP 实际上应该是什么是另一个问题。就我尝试过的代码而言,这里没有什么用处,因为自从我发现上面提到的问题以来,它已被证明是完全错误的方向。 我不是在寻找直接为我编写代码的人,我可以编写自己的代码,但我希望有人能让我走上正确的轨道,继续前进。不幸的是,我从来都不是 IP 地址的一员。我在学校花了很短的时间学习如何计算 IP 地址。那是 14 年前的事了,而且只是一个学期的一小部分。

最佳答案

您可以将 IP 地址解析为 32 位值(因为这是它真正代表的内容),然后您可以轻松地遍历一个范围并为它们创建 IP 地址。

转换:

public static uint ParseIP(string ip) {
  byte[] b = ip.Split('.').Select(s => Byte.Parse(s)).ToArray();
  if (BitConverter.IsLittleEndian) Array.Reverse(b);
  return BitConverter.ToUInt32(b, 0);
}

public static string FormatIP(uint ip) {
  byte[] b = BitConverter.GetBytes(ip);
  if (BitConverter.IsLittleEndian) Array.Reverse(b);
  return String.Join(".", b.Select(n => n.ToString()));
}

创建一个范围:

string StartIP = "192.168.0.1";
int IPCount = 61;

uint n = ParseIP("192.168.0.1");
string[] range = new string[IPCount];
for (uint i = 0; i < IPCount; i++) {
  range[i] = FormatIP(n + i);
}

关于c# - 从 IP 地址开始和 IP 地址计数生成 IP 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588246/

相关文章:

c# - 如何将 Markdown (WMD)文本转换为纯文本

algorithm - 在流图中搜索具有满足能力的最小流

networking - 端口转发和 Python 套接字

c# - html css链接中的动态查询字符串

c - 使用 C (Linux) 验证网络接口(interface)是否存在

perl - 使用 Perl 进行网络编程,作者 Stein - 仍然相关吗?

c# - 在 C# 中如何将 IP 地址字符串解析为 uint 值?

c# - OpenGL/DirectX Hook - 类似于 FRAPS

c# - 如何使用 Moq 从 IHttpClientFactory 模拟 HTTPClient 并结合 .NET Core 中的 Polly 策略

c# - 使用 LINQ Select New 时的转换问题