• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3198
  • Last Modified:

Get MAC Address from IP in Vista with C# (500pts!)

What I need is C# code that will take an IP Address and return the MAC Address of a remote device.

The code below accomplishes that in XP but not VISTA.  After reading a few articles it seems that the "Iphlpapi.dll" is not the same in Vista as it is in XP.

How can I accomplish this.  Specific examples would be great!
Thanks,

public string GetMacAddress(object response)
        {
            System.Net.IPAddress ip = System.Net.IPAddress.Parse(this.currentIp);
            System.Net.NetworkInformation.PhysicalAddress mac = GetMacFromIP(ip);
 
            //Format MAC Address.
            string macString = mac.ToString();
            for (int i = 2; i < macString.Length; i = i + 3)
            {
               macString = macString.Insert(i, ":");
            }
            return macString;
        }
 
        [System.Runtime.InteropServices.DllImport("Iphlpapi.dll", EntryPoint = "SendARP")]
        internal extern static Int32 SendArp(Int32 destIpAddress, Int32 srcIpAddress, byte[] macAddress, ref Int32 macAddressLength);
 
        
        public static System.Net.NetworkInformation.PhysicalAddress GetMacFromIP(System.Net.IPAddress IP)
        {
            if (IP.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
                throw new ArgumentException("supports just IPv4 addresses");
 
            Int32 addrInt = IpToInt(IP);
            Int32 srcAddrInt = IpToInt(IP);
            byte[] mac = new byte[6]; // 48 bit    
 
            int length = mac.Length;
            int reply = SendArp(addrInt, srcAddrInt, mac, ref length);
 
            byte[] emptyMac = new byte[12];
 
            if (reply != 0)
            {
                MessageBox.Show("No MAC Address found for IP Address: " + IP.ToString());
                return new System.Net.NetworkInformation.PhysicalAddress(emptyMac);
            }
            return new System.Net.NetworkInformation.PhysicalAddress(mac);
        }
 
        private static Int32 IpToInt(System.Net.IPAddress IP)
        {
            byte[] bytes = IP.GetAddressBytes();
            return BitConverter.ToInt32(bytes, 0);
        }

Open in new window

0
psft
Asked:
psft
1 Solution
 
dprovencherCommented:
Source and destination IPs are the same in your SendARP call.  A source address which is not linked to any network interface will return an error according to http://msdn.microsoft.com/en-us/library/aa366358(VS.85).aspx

Try to put 0 as source IP.
0
 
psftAuthor Commented:
You were right thanks for the insight
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now