是否可以通过 IPv6(无 WMI)从同一网络中的另一台 PC 获取 MAC?使用 IPv4 很容易(ARP)。
IPv6 使用“邻居发现协议”(NDP) 来获取 MAC 地址。.Net中有什么方法可以解决这个问题吗?
是否可以通过 IPv6(无 WMI)从同一网络中的另一台 PC 获取 MAC?使用 IPv4 很容易(ARP)。
IPv6 使用“邻居发现协议”(NDP) 来获取 MAC 地址。.Net中有什么方法可以解决这个问题吗?
您可以运行外部命令“netsh int ipv6 show neigh”,并过滤掉您感兴趣的主机。您应该在此之前联系过它,所以您知道它在 NC 中。
如果您想要一个 API,请使用GetIpNetTable2或更直接的ResolveIpNetEntry2。我怀疑是否有用于此的 .NET API,因此您必须使用 PInvoke。
Martin 的答案是针对 Windows,但这是针对您在 GNU/Linux 或其他 *nix 机器上的情况。
您想使用该命令的neigh
功能ip
来显示 IPv6 邻居,如下所示:
$ ip -6 neigh
fe80::200:ff:fe00:0 dev eth0 lladdr 00:0e:54:24:23:21 router REACHABLE
fe80::202:b0ff:fe01:2abe dev eth0 lladdr 00:02:b0:02:2a:be DELAY
(专业提示:您可以-6
关闭并在同一列表中查看 IPv4 ARP 和 IPv6 ND。)
此外,如果您想找出LAN 上所有IPv6 机器的 MAC 地址,而不仅仅是您已经知道的那些,您应该先 ping 它们,然后寻找邻居:
$ ping6 ff02::1%eth0
64 bytes from fe80::221:84ff:fe42:86ef: icmp_seq=1 ttl=64 time=0.053 ms # <-- you
64 bytes from fe80::200:ff:fe00:0: icmp_seq=1 ttl=64 time=2.37 ms (DUP!)
64 bytes from fe80::202:b0ff:fe01:2abe: icmp_seq=1 ttl=64 time=2.38 ms (DUP!)
64 bytes from fe80::215:abff:fe63:f6fa: icmp_seq=1 ttl=64 time=2.66 ms (DUP!)
$ ip -6 neigh
fe80::200:ff:fe00:0 dev eth0 lladdr 00:0e:54:24:23:21 router REACHABLE
fe80::202:b0ff:fe01:2abe dev eth0 lladdr 00:02:b0:02:2a:be DELAY
fe80::215:abff:fe63:f6fa dev eth0 lladdr 00:02:15:ab:f6:fa DELAY # <-- a new one!
The answer by @Alex would be better if the line parsing code were improved. Here is one way:
public static string netsh(String IPv6)
{
IPAddress wanted;
if (!IPAddress.TryParse(IPv6, out wanted))
throw new ArgumentException("Can't parse as an IPAddress", "IPv6");
Regex re = new Regex("^([0-9A-F]\S+)\s+(\S+)\s+(\S+)", RegexOptions.IgnoreCase);
// ... the code that runs netsh and gathers the output.
Match m = re.Match(output);
if (m.Success)
{
// [0] is the entire line
// [1] is the IP Address string
// [2] is the MAC Address string
// [3] is the status (Permanent, Stale, ...)
//
IPAddress found;
if (IPAddress.TryParse(m.Groups[1].Value, out found))
{
if(wanted.Equals(found))
{
return m.Groups[2].Value;
}
}
}
// ... the code that finishes the loop on netsh output and returns failure
}
这是我的代码:
public static string netsh(String IPv6)
{
Process p = new Process();
p.StartInfo.FileName = "netsh.exe";
String command = "int ipv6 show neigh";
Console.WriteLine(command);
p.StartInfo.Arguments = command;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
String output = "go";
while (output!=null){
try
{
output = p.StandardOutput.ReadLine();
}
catch (Exception)
{
output = null;
}
if (output.Contains(IPv6))
{
// Nimmt die Zeile in der sich die IPv6 Addresse und die MAC Addresse des Clients befindet
// Löscht den IPv6 Eintrag, entfernt alle Leerzeichen und kürzt den String auf 17 Zeichen, So erschein die MacAddresse im Format "33-33-ff-0d-57-00"
output = output.Replace(IPv6, "").Replace(" ", "").TrimToMaxLength(17) ;
return output;
}
}
return null;
}