【问题标题】:calculate IP range numbers from 2 given IP addresses [closed]从 2 个给定的 IP 地址计算 IP 范围编号 [关闭]
【发布时间】:2012-10-28 13:54:18
【问题描述】:

我在我的应用程序中使用 pcapdotnet DLL,我添加的选项之一是在发送 pcap 文件之前更改数据包 ip 地址(发送到我的函数 2 ip:旧 ip 地址和我想要的新 ip 地址改变)。

现在我想添加另一个可以更改 IP 地址范围的选项。

例如:

旧 ip 地址为 70.1.2.3,范围为 10.0.0.1 到 212.0.0.0

所以 IP 地址 70.1.2.3 将更改为 10.0.0.1,而不是 10.0.0.2 到 70.1.2.3,我正在寻找最好的方法。

到目前为止我只看到这个帖子没有帮助我:Is there easy way of calculating number of IPs from 2 given IP addresses?

【问题讨论】:

  • What have you tried?你在寻找什么样的“最佳”?表现?可读性?简洁?还有什么?

标签: c# pcap.net


【解决方案1】:
  1. 一个 IPv4 地址由 4 个字节组成,将这 4 个字节组合起来就可以得到一个普通的 32 位数字。您可以使用thread you linked 中描述的方法轻松获得此号码(我刚刚注意到@DarkSquirrel42 在我插手时已经发布了相同的答案)。我在那个答案中唯一要改变的是返回 一个无符号整数 (uint):

    public static uint IPToInt(string IP)
    {
         return (uint)IPAddress.NetworkToHostOrder(
             BitConverter.ToInt32(IPAddress.Parse(IP).GetAddressBytes(), 0));
    }
    
  2. 一旦你拥有它,它就是一个简单的数学问题:

    请注意,10.0.0.1212.0.0.0 的范围非常大。如果您将10.0.0.1 映射到70.1.2.3,您将在到达212.0.0.0 之前用完地址空间。

【讨论】:

  • 我认为我发现的最好的是:dreamincode.net/code/snippet3877.htm 但是在创建类对象并运行 GetIPRange 之后,我不知道为什么我的代码没有进入这个类
  • “我的代码没有进入课堂”是什么意思?你可以在你的问题中发布一些代码吗?
  • RangeFinder range = new RangeFinder();和 range.GetIPRange(oldIP, newIP);没有带我去上课,什么也没有发生
  • 对不起,我还是不明白。你认为应该发生什么?我不明白“进入课堂”是什么意思?
  • 我正在检查调试器并在创建类对象 range.GetIPRange(oldIP, newIP);什么也没做,它应该进入 GetIPRange 函数但它没有
【解决方案2】:

“没有帮助”的帖子有你需要的一切:

它向您展示了如何将三点格式的 IPv4 转换为 Int32(因为 IPv4 地址的大小正好是 32 位,所以可以这样做)

从那里你可以简单地开始计数

你想要做的看起来像:

将您的 IP 范围转换为 2 个 32 位整数

做一个从一个到另一个的for循环

将循环变量转换回三点形式

可选择检查不应使用的 IP 并跳过它们(在无类别 IP 范围的情况下,您可能希望排除在有类别范围内可能是网络或广播地址的 IP...)

【讨论】:

  • 我试了一下,你说得对,顺便说一句,在获得 IP 数量后,确保我的 IP 保持正确的最佳方法是什么? (在 192.168.0.255 之后将出现 192.168.1.0 而不是 192.168.0.256)
  • @user1269592:DarkSquirrel 说你需要将 IP 转换为整数,然后循环 整数(增加这些数字,而不是 IP),然后将整数变量转换回三点形式。
猜你喜欢
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2015-04-05
  • 2016-01-15
相关资源
最近更新 更多