How do I obtain the physical (MAC) address of an IP address using C#?

后端 未结 4 1398
失恋的感觉
失恋的感觉 2020-12-05 20:03

From C#, I want to do the equivalent of the following:

arp -a |findstr 192.168.1.254

Alternatively, the answer could call the SendARP funct

相关标签:
4条回答
  • 2020-12-05 20:41

    Here is my solution.

    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 讨论(0)
  • 2020-12-05 20:41

    To find your own:

    Add a reference to 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());
    }
    

    Not sure about finding that of another device.

    0 讨论(0)
  • 2020-12-05 20:47

    SendARP P/Invoke goes like this:

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

    PInvoke.NET has this example:

    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));
    
    0 讨论(0)
  • 2020-12-05 20:53

    Hook into the WMI subsystem. Some VBScript code to get going in the right direction is here

    0 讨论(0)
提交回复
热议问题