【发布时间】:2021-06-29 08:54:22
【问题描述】:
我在互联网上尝试了很多从本地网络获取 IP 的解决方案,但都未能获得所有 IP。 我也尝试使用 ARP 命令“arp /a”和“arp -a”来获取 IP,但是在搜索了一段时间后,这个命令也无法完成这项工作,我找到了一个名为“Advance IP Scanner”的软件,当我运行这个软件它从本地网络获取所有IP,对我来说最奇怪的是,在运行高级IP扫描仪后,当我运行ARP命令“arp /a”或“arp -a”时,它会从我的本地获取所有IP网络。
这是我尝试过的。
public List<IPScanEntity> GetArpResult()
{
List<IPScanEntity> List = new List<IPScanEntity>();
string baseIp = ConfigurationManager.AppSettings["baseIp"];
//getting my own system IP
List.Add(HostIPScanResult());
for (int subnet = 1; subnet < 255; subnet++)
{
bool a = List.Any(x => x.Ip.Equals(baseIp+subnet.ToString()));
if (a == true)
{
continue;
}
try
{
var p = Process.Start(new ProcessStartInfo("arp", "/a " + baseIp + subnet)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true
});
var output = p?.StandardOutput.ReadToEnd();
p?.Close();
var lines = output.Split('\n').Where(l => !string.IsNullOrWhiteSpace(l));
if (!lines.Contains("No ARP Entries Found.\r"))
{
var result =
(from line in lines
select Regex.Split(line, @"\s+")
.Where(i => !string.IsNullOrWhiteSpace(i)).ToList()
into items
where items.Count == 3
select new IPScanEntity
{
Ip = items[0],
MacAddress = items[1],
});
List.Add(result.FirstOrDefault());
}
}
catch (Exception ex)
{
log.Error(ex.Message);
}
}
return List;
}
【问题讨论】:
-
这能回答你的问题吗? How to get IP of all hosts in LAN?
-
ARP 消息通常在机器启动时发送,并且在启动后每隔 20 分钟定期发送一次。它通常不会通过路由器,因此您只能在本地子网中或 ping IP 地址后看到结果。要使用更多地址填充 ARP 表,您可以 ping 范围内的每个 IP,然后该范围内的所有计算机都会响应。您可以忽略不响应的 IP 地址。然后在完成 PING 后读取 ARP 表。