【问题标题】:Easiest way to find free IPAddress in current subnet?在当前子网中找到免费 IPAddress 的最简单方法是什么?
【发布时间】:2011-01-17 09:59:10
【问题描述】:

在本地适配器子网上查找下一个未使用的 IP 地址的最简单方法是什么?

IPAddress GetNextFreeIP(NetworkInterface intface)
{
    ...?
}

更新
我编写了一个 BOOTP/TFTP 服务器,可用于许多不同的场景(交叉电缆、小型专用网络、大型企业网络)。我必须给我正在更新IP地址的小型嵌入式系统,并想找到一个备用的供它使用......

【问题讨论】:

  • 您的程序应该能够接受命令行选项来指示它使用 DHCP、静态 IP 或(作为最后的手段)使用您的 GetNextFreeIP 猜测。

标签: c# .net networking ip-address


【解决方案1】:

当您说无法确保某个 IP 未被使用时,您在技术上是正确的。但我决定暂时依赖这个......

    public static IPAddress FindNextFree(this IPAddress address)
    {
        IPAddress workingAddress = address;
        Ping pingSender = new Ping();

        while (true)
        {
            byte[] localBytes = workingAddress.GetAddressBytes();

            localBytes[3]++;
            if (localBytes[3] > 254)
                localBytes[3] = 1;

            workingAddress = new IPAddress(localBytes);

            if (workingAddress.Equals(address))
                throw new TimeoutException("Could not find free IP address");

            PingReply reply = pingSender.Send(workingAddress, 1000);
            if (reply.Status != IPStatus.Success)
            {
                return workingAddress;
            }
        }
    }

【讨论】:

    【解决方案2】:

    从我所看到的带有 TFTP 服务器的嵌入式设备中,它们启动时使用记录在案的硬编码 IP 地址。经过一段设定的时间(约 3-10 秒)后,引导加载程序将控制权转移给读取其配置并设置 IP 地址的应用程序。

    如果有人想使用引导加载程序来加载新固件,那么他们需要阅读文档,确保 IP 地址可访问(在同一子网上),重新启动设备,然后将应用程序通过 TFTP 传输到设备。

    【讨论】:

      【解决方案3】:

      除了询问 DHCP 服务器之外,我猜您还可以在子网上进行广播 ping 并收集所有计算机的响应,然后简单地对 IP 地址进行排序以找到下一个。当然,这假设所有设备都在线并响应广播。所以在一个相当受控的环境中,这可以工作。

      【讨论】:

      • 问题是,在任何足够先进的网络中,您永远无法知道哪些主机已启动,哪些路由器会过滤您的 ping 数据包等。遗憾的是,IP 本身没有可靠的方法。
      【解决方案4】:

      正如 Thorsten79 刚才所说,简短的回答是你不能。

      稍微长一点的答案:

      这取决于您的网络配置:管理员如何决定分配 IP 地址。通常混合了手动分配的服务器、路由器等 IP 地址,以及一组 dhcp 分配的工作站等 IP 地址。

      如果您可以与 dhcp 服务器通信,您可能会发现保留范围内的哪些地址是空闲的,但对于其余地址,您无法找到。

      更有趣的问题是您要完成什么?也许它可以用不同的方式来实现?

      【讨论】:

        【解决方案5】:

        如果您有 DHCP 管理的 IP 范围,则您有一个可以与之通信的实例 - DHCP 服务器(就像 David 推荐的那样)

        如果您没有托管 IP 范围并且没有其他可以与之通信的实例,则没有可靠的方法来判断 IP 是否已使用或未使用。 IP 本身不提供此类服务。

        【讨论】:

        • +1 用于 DHCP,因为这正是 DHCP 旨在解决的问题!
        • 好吧,DHCP 可能被配置为提供从 192.168.1.1/24 到 192.168.1.128/24 的地址,而从 192.158.1.128/24 到 192.168.1.254/24 的地址是手动分配的。在这种情况下,您将从 DHCP 获得什么样的信息?正如@tuinstoelen 和@Thorsten79 指出的那样,原始问题的唯一正确答案是“你不能”
        猜你喜欢
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多