如何使用 C# 确定本地网络上的哪些 IP 地址是静态/动态的?

Posted

技术标签:

【中文标题】如何使用 C# 确定本地网络上的哪些 IP 地址是静态/动态的?【英文标题】:How can I use C# to determine which IP addresses on my local network are static/dynamic? 【发布时间】:2019-08-08 23:17:42 【问题描述】:

我正在扫描本地网络上的 IP,当找到 IP 时我希望收到的信息之一是该 IP 是静态的还是动态的。到目前为止,我发现的最接近我的问题只解决了检查您自己的机器的问题。这是我的功能:

    private bool isDynamic()
    
        NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
        int currentSocketIndex = (new IPPacketInformation()).Interface;

        bool isDynamic = adapters[currentSocketIndex].GetIPProperties().GetIPv4Properties().IsDhcpEnabled;
        return isDynamic;
    

我想修改一下,让它可以取一个IP地址,连接到该IP所属的设备(如果存在且不阻塞连接),并判断是否那个机器的IP是静态/动态的。目前,我的函数只检查我的机器。

谁能指出我正确的方向?我找不到做这样的事情的参考资料,但我怀疑这是不可能的。

【问题讨论】:

你找不到任何关于它的信息,因为如果你没有访问路由器,那是不可能的 您知道用于 DHCP 池的地址范围吗?如果是这样,您可以在此之外找到地址并假设它们是静态的。我认为 WMI 还可以告诉你它是否是动态的,如果客户端都是 Windows 并且你有那种访问权限。 @itsme86(一些?)路由器可以从 DHCP 池中保留静态地址。 WMI 确实可以做到这一点 - 检查 Win32_NetworkAdapterConfiguration 类的 DHCPEnabled 属性。但是,您需要以有权以管理员身份连接的帐户运行 WMI 查询。 @stuartd 那么这意味着使用 WMI 需要我拥有每台机器的特定管理员帐户凭据? 【参考方案1】:

您找不到任何关于它的信息,因为如果您无法访问路由器,这是不可能的。您只能通过询问路由器来找到它,这很可能不会告诉您或需要特定于路由器的请求/协议来告诉您。或者你可以直接询问设备,它不会告诉你它的 IP 是静态的还是动态的,除非你在该机器上安装一个应用程序来回答你的请求。一些操作系统可能已经提供了这种服务(如 Windows 上的 WMI),但您永远无法分辨出每个网络设备。

但是:

如果你有很多时间,你可以监听 DHCP/BootP 流量并找到像这样的动态设备,因为动态设备会频繁刷新它们的会话

不同的方法:

新想法,但在重要网络中这样做很危险,我根本不建议这样做:启动您自己的 DHCP 服务器并开始提供地址,看看谁接受它们,然后再将它们放回去。请注意,这可能会对公司网络造成巨大的损害。

【讨论】:

有趣。我不认为检查机器是否启用了 DHCP 是不可能的。这就解释了为什么我没有找到有关该主题的任何信息。 你可以在 67/68 端口上监听广播消息并希望流量和捕获一些通信但它不可靠 @DenisSchaf 确实不可靠,您必须等待完整的 DCHP 更新超时才能收集有用的信息,并且根据环境,这可能是一个很长的时间。如果它们是 Windows 机器,最好使用 WMI。 即使这不是您希望的答案,我认为这是正确的答案

以上是关于如何使用 C# 确定本地网络上的哪些 IP 地址是静态/动态的?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的 IP 获取本地网络上的机器 MAC 地址

思科高级路由与交换(CISCO 部分) 第5天

给定服务器的 IP 地址和端口,如何使用 C# 测试与服务器的 TCP 连接?

C# - 连接到 (RAS) *** 时如何获取 IP 地址

C# - 识别另一个网络上的计算机

是否有库函数来确定 IP 地址(IPv4 和 IPv6)在 C/C++ 中是否为私有/本地?