Q:

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

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.

A:

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));

A:

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();
    }
}

