Ping 或以其他方式通过 C# 中的 MAC 判断设备是不是在网络上
Posted
技术标签:
【中文标题】Ping 或以其他方式通过 C# 中的 MAC 判断设备是不是在网络上【英文标题】:Ping or otherwise tell if a device is on the network by MAC in C#Ping 或以其他方式通过 C# 中的 MAC 判断设备是否在网络上 【发布时间】:2011-02-03 18:10:54 【问题描述】:我正在开发一个家庭安全应用程序。我想做的一件事是根据我是否在家自动关闭和打开它。我有一部带 Wifi 的手机,当我在家时,它会自动连接到我的网络。
电话通过 DHCP 连接并获取其地址。虽然我可以将其配置为使用静态 IP,但我宁愿不这样做。 C# / .Net 中是否有任何类型的“Ping”或等效项可以获取设备的 MAC 地址并告诉我它当前是否在网络上处于活动状态?
编辑:澄清一下,我在 PC 上运行软件,我希望能够检测到同一 LAN 上的手机。
编辑:这是我想出的代码,感谢 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<128; i++)
// ping every address in the DHCP pool, in a separate thread so
// that we can do them all at once
IPAddress ip = new IPAddress(IPAddress.HostToNetworkOrder(baseaddr + i));
Thread t = new Thread(() =>
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;
【问题讨论】:
这个问题可能对你有帮助***.com/questions/1148778/…。它将帮助您从 IP 获取 MAC。或者使用“arp -a”并解析输出。 你可以反过来做吗?就像您的手机上有一个应用程序可以检测到它何时在家庭网络上,然后告诉您家中的应用程序它在范围内?通常你可以让手机在连接时通知你。 这是脚本的最终版本吗? 不是真的;我把它分成两部分——一个循环通过 DHCP 空间的 ping 线程,大约每秒 ping 一次每个地址,然后是解析 ARP.exe 输出的主要部分。我这样做是因为这里给出的 ping 每个地址的技术遇到了限制和其他限制问题。 【参考方案1】:另一种方法是使用ping
和arp
工具。由于 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 分钟或更短时间就会被清除一次。
【讨论】:
好的,现在我在家并且有时间玩这个,我刚刚试了一下,它唯一可以使用的设备是我的台式电脑和我的文件服务器。它错过了网络上的大多数其他设备(无线适配器、电话、打印机、其他笔记本电脑、几个虚拟机......)它确实拾取的一个设备是两个交换机。 要进行测试,请尝试通过 IP ping 那些错过的设备之一,然后检查arp -a
。如果这样可行,那么设备可能不会响应广播 ping。 :/ 也许这毕竟不是最好的方法。【参考方案2】:
您可以使用RARP protocol 广播谁拥有该 MAC 地址的请求。所有者将使用其 IP 地址进行响应。我不知道要推荐的 RARP 工具或库,因此您可以考虑编写自己的网络层来发送/接收这些数据包。
【讨论】:
您将需要原始套接字来执行此操作 - 完成后告诉我们,因为我们希望看到以上是关于Ping 或以其他方式通过 C# 中的 MAC 判断设备是不是在网络上的主要内容,如果未能解决你的问题,请参考以下文章
同时解析python中的多个子命令或以其他方式对解析的参数进行分组
像图像或 PDF 文件这样的 MIME 类型不需要 base64 或以其他方式编码吗?
将 SQL 地理转换为 SQL 几何或以其他方式提高查找速度