2008-10-09 4 views
10

От C# я хочу сделать эквивалент следующее:Как получить физический (MAC) адрес IP-адреса с помощью C#?

arp -a |findstr 192.168.1.254 

В качестве альтернативы, ответ может вызвать функцию SendARP и получить результаты.

Это позволит моему приложению выполнить некоторую другую обработку, требующую MAC-адрес.

ответ

23

SendARP P/Invoke выглядит следующим образом:

[DllImport("iphlpapi.dll", ExactSpelling=true)] 
public static extern int SendARP(int destIp, int srcIP, byte[] macAddr, ref uint physicalAddrLen); 

PInvoke.NET имеет следующий пример:

IPAddress dst = IPAddress.Parse("192.168.2.1"); // the destination IP address 

byte[] macAddr = new byte[6]; 
uint macAddrLen = (uint)macAddr.Length; 

if (SendARP(BitConverter.ToInt32(dst.GetAddressBytes(), 0), 0, macAddr, ref macAddrLen) != 0) 
    throw new InvalidOperationException("SendARP failed."); 

string[] str = new string[(int)macAddrLen]; 
for (int i=0; i<macAddrLen; i++) 
    str[i] = macAddr[i].ToString("x2"); 

Console.WriteLine(string.Join(":", str)); 
+2

Что нужно знать об этом ответ, который я обнаружил при тестировании на Windows XP с помощью Wireshark: 1) Если адрес пары IP/MAC уже в кэше ARP, пакет запроса ARP НЕ будет отправлено на сети, но SendARP все равно вернет (потенциально устаревший) macAddress, который он имеет в своем кеше. 2) Этот метод потенциально очень медленный, если используется только один поток. Проникновение через полную подсеть IP-адресов (например, 192.168.1.x) с использованием одного потока заняло 250 + секунд (1 секунду на IP-адрес). Для массового многопоточности заняло менее секунды для всех 250 + адресов. – Pretzel 2009-07-20 18:23:13

1

крюк в подсистему WMI. Некоторый код VBScript, чтобы получить движение в правильном направлении here

1

Чтобы найти свой собственный:

Добавить ссылку на System.Management

ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 

ManagementObjectCollection mcCol = mc.GetInstances(); 

foreach (ManagementObject mcObj in mcCol) 
{ 
    Console.WriteLine(mcObj["Caption"].ToString()); 
    Console.WriteLine(mcObj["MacAddress"].ToString()); 
} 

Не уверен, что найти другого устройства.

1

Это мое решение.

public static class MacResolver 
{ 
    /// <summary> 
    /// Convert a string into Int32 
    /// </summary> 
    [DllImport("Ws2_32.dll")] 
    private static extern Int32 inet_addr(string ip); 

    /// <summary> 
    /// The main funtion 
    /// </summary> 
    [DllImport("Iphlpapi.dll")] 
    private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 len); 

    /// <summary> 
    /// Returns the MACAddress by a string. 
    /// </summary> 
    public static Int64 GetRemoteMAC(string remoteIP) 
    { 
     Int32 ldest = inet_addr(remoteIP); 

     try 
     { 
      Int64 macinfo = 0;   
      Int32 len = 6;   

      int res = SendARP(ldest, 0, ref macinfo, ref len); 

      return macinfo;  
     } 
     catch (Exception e) 
     { 
      return 0; 
     } 
    } 

    /// <summary> 
    /// Format a long/Int64 into string. 
    /// </summary> 
    public static string FormatMac(this Int64 mac, char separator) 
    { 
     if (mac <= 0) 
      return "00-00-00-00-00-00"; 

     char[] oldmac = Convert.ToString(mac, 16).PadLeft(12, '0').ToCharArray(); 

     System.Text.StringBuilder newMac = new System.Text.StringBuilder(17); 

     if (oldmac.Length < 12) 
      return "00-00-00-00-00-00"; 

     newMac.Append(oldmac[10]); 
     newMac.Append(oldmac[11]); 
     newMac.Append(separator); 
     newMac.Append(oldmac[8]); 
     newMac.Append(oldmac[9]); 
     newMac.Append(separator); 
     newMac.Append(oldmac[6]); 
     newMac.Append(oldmac[7]); 
     newMac.Append(separator); 
     newMac.Append(oldmac[4]); 
     newMac.Append(oldmac[5]); 
     newMac.Append(separator); 
     newMac.Append(oldmac[2]); 
     newMac.Append(oldmac[3]); 
     newMac.Append(separator); 
     newMac.Append(oldmac[0]); 
     newMac.Append(oldmac[1]); 

     return newMac.ToString(); 
    } 
} 
+0

Это возвращает допустимый MAC-адрес только при использовании IP-адреса, а при использовании имени хоста адрес mac неверен. – 2017-03-27 06:28:12

Смежные вопросы