IPv6(WMIなし)を介して同じネットワーク内の別のPCからMACを取得することは可能ですか?IPv4では簡単です(ARP)。
IPv6は、「近隣探索プロトコル」(NDP)を使用してMACアドレスを取得します。このための.Netのメソッドはありますか?
IPv6(WMIなし)を介して同じネットワーク内の別のPCからMACを取得することは可能ですか?IPv4では簡単です(ARP)。
IPv6は、「近隣探索プロトコル」(NDP)を使用してMACアドレスを取得します。このための.Netのメソッドはありますか?
外部コマンド「netshintinipv6 show neigh」を実行して、関心のあるホストを除外できます。その直前に連絡しておく必要があるため、NCにあることがわかります。
そのためのAPIが必要な場合は、GetIpNetTable2を使用するか、より直接的にはResolveIpNetEntry2を使用します。このための.NETAPIがあるとは思えないので、PInvokeを使用する必要があります。
マーティンの答えは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
オフのままにして、IPv4ARPとIPv6NDを同じリストに表示できます。)
また、 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!
行解析コードが改善されれば、@Alexによる回答の方が良いでしょう。これが1つの方法です:
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;
}