Get the MAC address of a computer on a local network from its IP address in C #

I am trying to write a function that takes one IP address as a parameter and requests this machine in my local network for it MAC address .

I have seen many examples that use the local MAC address machine, but not one (I have not found) that seems to be asking her for a local network machine.

I know that this task is achievable, since this Firmware for LAN scanners scans the local IP range and returns the MAC address / host name for all on the machines.

Can someone tell me where I would start trying to write a function to achieve this in C #? Any help would be greatly appreciated. Thanks

EDIT:

According to Marco Mp's comments below, ARP tables were used. class arp

+7
source share
3 answers

As in Marco Mp's comment above, ARP tables were used. class arp

0
source
 public string GetMacAddress(string ipAddress) { string macAddress = string.Empty; System.Diagnostics.Process pProcess = new System.Diagnostics.Process(); pProcess.StartInfo.FileName = "arp"; pProcess.StartInfo.Arguments = "-a " + ipAddress; pProcess.StartInfo.UseShellExecute = false; pProcess.StartInfo.RedirectStandardOutput = true; pProcess.StartInfo.CreateNoWindow = true; pProcess.Start(); string strOutput = pProcess.StandardOutput.ReadToEnd(); string[] substrings = strOutput.Split('-'); if (substrings.Length >= 8) { macAddress = substrings[3].Substring(Math.Max(0, substrings[3].Length - 2)) + "-" + substrings[4] + "-" + substrings[5] + "-" + substrings[6] + "-" + substrings[7] + "-" + substrings[8].Substring(0, 2); return macAddress; } else { return "not found"; } } 

Very late: In the open suce iSpy project ( https://github.com/ispysoftware/iSpy ) they use this code, which is a bit nicer

  public static void RefreshARP() { _arpList = new Dictionary<string, string>(); _arpList.Clear(); try { var arpStream = ExecuteCommandLine("arp", "-a"); // Consume first three lines for (int i = 0; i < 3; i++) { arpStream.ReadLine(); } // Read entries while (!arpStream.EndOfStream) { var line = arpStream.ReadLine(); if (line != null) { line = line.Trim(); while (line.Contains(" ")) { line = line.Replace(" ", " "); } var parts = line.Trim().Split(' '); if (parts.Length == 3) { string ip = parts[0]; string mac = parts[1]; if (!_arpList.ContainsKey(ip)) _arpList.Add(ip, mac); } } } } catch (Exception ex) { Logger.LogExceptionToFile(ex, "ARP Table"); } if (_arpList.Count > 0) { foreach (var nd in List) { string mac; ARPList.TryGetValue(nd.IPAddress.ToString(), out mac); nd.MAC = mac; } } } 

https://github.com/ispysoftware/iSpy/blob/master/Server/NetworkDeviceList.cs

Update 2 is even later, but I think this is best because it uses a regex that checks best for exact matches.

 public string getMacByIp(string ip) { var macIpPairs = GetAllMacAddressesAndIppairs(); int index = macIpPairs.FindIndex(x => x.IpAddress == ip); if (index >= 0) { return macIpPairs[index].MacAddress.ToUpper(); } else { return null; } } public List<MacIpPair> GetAllMacAddressesAndIppairs() { List<MacIpPair> mip = new List<MacIpPair>(); System.Diagnostics.Process pProcess = new System.Diagnostics.Process(); pProcess.StartInfo.FileName = "arp"; pProcess.StartInfo.Arguments = "-a "; pProcess.StartInfo.UseShellExecute = false; pProcess.StartInfo.RedirectStandardOutput = true; pProcess.StartInfo.CreateNoWindow = true; pProcess.Start(); string cmdOutput = pProcess.StandardOutput.ReadToEnd(); string pattern = @"(?<ip>([0-9]{1,3}\.?){4})\s*(?<mac>([a-f0-9]{2}-?){6})"; foreach (Match m in Regex.Matches(cmdOutput, pattern, RegexOptions.IgnoreCase)) { mip.Add(new MacIpPair() { MacAddress = m.Groups["mac"].Value, IpAddress = m.Groups["ip"].Value }); } return mip; } public struct MacIpPair { public string MacAddress; public string IpAddress; } 
+13
source
 using System.Net; using System.Runtime.InteropServices; [DllImport("iphlpapi.dll", ExactSpelling = true)] public static extern int SendARP(int DestIP, int SrcIP, [Out] byte[] pMacAddr, ref int PhyAddrLen); try { IPAddress hostIPAddress = IPAddress.Parse("XXX.XXX.XXX.XX"); byte[] ab = new byte[6]; int len = ab.Length, r = SendARP((int)hostIPAddress.Address, 0, ab, ref len); Console.WriteLine(BitConverter.ToString(ab, 0, 6)); } catch (Exception ex) { } 

or with PC name

 try { Tempaddr = System.Net.Dns.GetHostEntry("DESKTOP-xxxxxx"); } catch (Exception ex) { } byte[] ab = new byte[6]; int len = ab.Length, r = SendARP((int)Tempaddr.AddressList[1].Address, 0, ab, ref len); Console.WriteLine(BitConverter.ToString(ab, 0, 6)); 
0
source

All Articles