在C#中通过MAC Ping或以其他方式告知设备是否在网络上

我正在开发一个家庭安全应用程序。 我想做的一件事是根据我是否在家里自动关闭它。 我有一部带Wifi的手机,当我回家时,它会自动连接到我的网络。

手机通过DHCP连接并获取其地址。 虽然我可以将其配置为使用静态IP,但我宁愿不这样做。 在C#/ .Net中是否有任何类型的“Ping”或等效设备可以获取设备的MAC地址并告诉我它是否在网络上当前处于活动状态?

编辑:为了澄清,我正在PC上运行软件,我希望能够在同一局域网上检测到手机。

编辑:这是我想出的代码,感谢spoulson的帮助。 它可靠地检测我感兴趣的任何手机是否在家里。

private bool PhonesInHouse() { Ping p = new Ping(); // My home network is 10.0.23.x, and the DHCP // pool runs from 10.0.23.2 through 10.0.23.127. int baseaddr = 10; baseaddr <<= 8; baseaddr += 0; baseaddr <<= 8; baseaddr += 23; baseaddr <<= 8; // baseaddr is now the equivalent of 10.0.23.0 as an int. for(int i = 2; i { try { Ping p = new Ping(); p.Send(ip, 1000); } catch { } }); t.Start(); } // Give all of the ping threads time to exit Thread.Sleep(1000); // We're going to parse the output of arp.exe to find out // if any of the MACs we're interested in are online ProcessStartInfo psi = new ProcessStartInfo(); psi.Arguments = "-a"; psi.FileName = "arp.exe"; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; psi.CreateNoWindow = true; bool foundone = false; using (Process pro = Process.Start(psi)) { using (StreamReader sr = pro.StandardOutput) { string s = sr.ReadLine(); while (s != null) { if (s.Contains("Interface") || s.Trim() == "" || s.Contains("Address")) { s = sr.ReadLine(); continue; } string[] parts = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // config.Phones is an array of strings, each with a MAC // address in it. // It's up to you to format them in the same format as // arp.exe foreach (string mac in config.Phones) { if (mac.ToLower().Trim() == parts[1].Trim().ToLower()) { try { Ping ping = new Ping(); PingReply pingrep = ping.Send(parts[0].Trim()); if (pingrep.Status == IPStatus.Success) { foundone = true; } } catch { } break; } } s = sr.ReadLine(); } } } return foundone; } 

另一种方法是使用pingarp工具。 由于ARP数据包只能保留在同一个广播域中,因此您可以ping通网络的广播地址,每个客户端都会回复ARP响应。 每个响应都缓存在您的ARP表中,您可以使用命令arp -a查看。 破旧:

 rem Clear ARP cache netsh interface ip delete arpcache rem Ping broadcast addr for network 192.168.1.0 ping -n 1 192.168.1.255 rem View ARP cache to see if the MAC addr is listed arp -a 

其中一些可以在托管代码中完成,例如在System.Net.NetworkInformation命名空间中。

注意:通过清除其他本地服务器的缓存条目,清除ARP缓存可能会对网络性能产生轻微影响。 但是,缓存通常每20分钟或更短时间清除一次。

您可以使用RARP协议来广播谁拥有该MAC地址的请求。 所有者将使用其IP地址进行回复。 我不知道要推荐的RARP工具或库,因此您可以考虑编写自己的网络层来发送/接收这些数据包。