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 function and get the results.
This will allow my application to do some other processing that requires the MAC address.
Windows devices To Find the MAC Address: Open a Command Prompt -> type ipconfig /all and press Enter-> The Physical Address is the MAC address.
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();
}
}
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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With