2010-11-03 3 views
5

Привет, ребята, Я искал в Интернете решение, но я ничего не нашел! :(Получите удаленный MAC-адрес через IPv6

Возможно ли получить MAC с другого ПК в той же сети через IPv6 (без WMI)? С IPv4 это легко (ARP). IPv6 использует «Протокол обнаружения соседства» (NDP) для получить адрес MAC. существуют ли методы в .NET для этого?

любых предложения? Спасибо за вашу помощь!

с уважением

Fabian

+0

что здесь точка OSX? вопрос и и принятый ответ выглядят совершенно не относящимися к OSX ... – ivan

ответ

3

Вы можете запустить внешнюю команду «нэ tsh int ipv6 show neigh "и отфильтруйте интересующий вас хост. Вам нужно было связаться с ним непосредственно перед этим, так что вы знаете, что он находится в NC.

Если вы хотите использовать API для этого, используйте GetIpNetTable2 или, более непосредственно, ResolveIpNetEntry2. Я сомневаюсь, что для этого есть .NET API, поэтому вам придется использовать PInvoke.

+0

Спасибо. Я думаю, что это должно решить мою проблему. Я попробовал, но это не просто заставить его работать через 5 минут;). Если у меня есть результат, я снова контактирую – Fabian

2

Ответ Мартина был для 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 

(Pro совет: вы можете оставить -6 офф и просматривать IPv4 ARP, а также IPv6 ND в тот же список.)

Кроме того, если вы хотите, чтобы узнать MAC-адрес всех машин IPv6 в локальной сети, а не просто те, которые вы уже знаете, вы должны пинговать их первым, а затем посмотреть для ne ighbours:

$ 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! 
+0

Большое спасибо за ваш ответ. Хотя она не подходит полностью, потому что я работаю на C# и .Net. Но она помогла мне, тем не менее. – Fabian

-1

Вот мой код:

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; 

     } 
+0

Почему downvote? –

+0

Я подозреваю, что голосом было, потому что это очень хрупкий синтаксический код. Если аргумент IPv6 находится в другом случае из вывода netsh, он будет терпеть неудачу. Если аргумент IPv6 совершенно легален и правилен, но делает другой выбор в отношении нулевого или свертывания нулевых полей, то он не будет выполнен. Если аргумент IPv6 является подмножеством того, что появляется на строке, он даст ложноположительное совпадение. –

0

Ответ на @Alex будет лучше, если строка кода синтаксического анализа были улучшены. Вот один из способов:

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 
}