我也创建了一个实时主机扫描仪。它使用 ARP 检查计算机是否在线。ARP 请求比 ping 主机要快得多。这是我用来检查主机是否可用的代码:
//You'll need this pinvoke signature as it is not part of the .Net framework
[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP,
byte[] pMacAddr, ref uint PhyAddrLen);
//These vars are needed, if the the request was a success
//the MAC address of the host is returned in macAddr
private byte[] macAddr = new byte[6];
private uint macAddrLen;
//Here you can put the IP that should be checked
private IPAddress Destination = IPAddress.Parse("127.0.0.1");
//Send Request and check if the host is there
if (SendARP((int)Destination.Address, 0, macAddr, ref macAddrLen) == 0)
{
//SUCCESS! Igor it's alive!
}
如果你有兴趣, Nmap 也使用这种技术来扫描可用的主机。
ARP 扫描让 Nmap 及其优化算法负责 ARP 请求。如果它得到响应,Nmap 甚至不需要担心基于 IP 的 ping 数据包,因为它已经知道主机已启动。这使得 ARP 扫描比基于 IP 的扫描更快、更可靠。因此,当扫描 Nmap 检测到的以太网主机位于本地以太网网络时,默认情况下会执行此操作。即使指定了不同的 ping 类型(例如 -PE 或 -PS),Nmap 也会对同一 LAN 上的任何目标使用 ARP。
这仅适用于当前子网!只要请求机器和目标之间没有路由器,它就可以正常工作。
ARP 是一种不可路由的协议,因此只能在同一以太网网络上的系统之间使用。[...] arp-scan 可用于发现本地网络上的 IP 主机。它可以发现所有主机,包括那些阻止所有 IP 流量的主机,例如防火墙和带有入口过滤器的系统。-摘自 NTA-Monitor 维基
有关 SendARP 功能的更多信息,您可以查看pinvoke.net文档。