gpt4 book ai didi

c# - Ping 或以其他方式通过 C# 中的 MAC 判断设备是否在网络上

转载 作者:可可西里 更新时间:2023-11-01 08:12:49 26 4
gpt4 key购买 nike

我正在开发家庭安全应用程序。我想做的一件事是根据我是否在家自动关闭和打开它。我有一部带 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;
}

最佳答案

另一种方法是使用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 分钟或更短时间清除一次。

关于c# - Ping 或以其他方式通过 C# 中的 MAC 判断设备是否在网络上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com