【发布时间】:2010-05-20 12:10:07
【问题描述】:
有没有一种优雅的方法可以让程序检测连接到网络的新计算机?
我希望我的程序“自动感知”连接到网络上的新计算机(它们在同一个网络上)。就像 USB 设备连接到计算机一样。
我现在正在做的是不时保存网络中所有计算机的列表。另一种方法是 PING 子网上的所有可用 IP。
还有其他优雅的方法吗?
谢谢!
【问题讨论】:
标签: networking
有没有一种优雅的方法可以让程序检测连接到网络的新计算机?
我希望我的程序“自动感知”连接到网络上的新计算机(它们在同一个网络上)。就像 USB 设备连接到计算机一样。
我现在正在做的是不时保存网络中所有计算机的列表。另一种方法是 PING 子网上的所有可用 IP。
还有其他优雅的方法吗?
谢谢!
【问题讨论】:
标签: networking
侦听 ARP 请求是执行此操作的规范方法。无论是否与 DHCP 无关,任何希望与外界通信的连接计算机都必须针对默认路由器的地址进行 ARP 请求。此请求将以广播的形式发出,并包含源接口的 MAC 和 IP 地址。
如果另一台计算机使用 DHCP,它将向自己的地址发出 ARP 请求,作为重复地址检测的一部分,这也是您可以窥探的广播。
(这与 IPv6 的工作方式大致相同,只是您需要寻找邻居发现或路由器请求数据包。)
就像提到的答案一样,如果您有一个可以远程登录或使用 SNMP 的交换机,则可以提取 MAC 表。这将为您提供交换机中每个端口上的 MAC 地址列表。但是,如果您想要 IP 地址,您仍然需要侦听 ARP:s。
另一方面,如果您可以访问网络上的默认网关,您还可以查看那里的 ARP 表。这将为您提供最近(对于最近...的不同值)与之通信的任何人的 MAC 和 IP 地址。
【讨论】:
如果您有某种托管交换机,您可能可以连接到该交换机,这将是一种相当优雅的方法。
如果您在域中,则可以从域控制器获取加入该域的所有计算机的列表。
如果做不到这一点,我所能想到的要么是挑战/响应的事情(例如 ping 它们),要么是通过检测从它们发送的流量(请参阅this question 可能是一个起点?),这两者都没有让我印象深刻优雅的方法。
【讨论】: