Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c#

networking

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.

like image 564
Iain Avatar asked Oct 09 '08 15:10

Iain


People also ask

How do I find the MAC address of a device on my network using cmd?

Windows devices To Find the MAC Address: Open a Command Prompt -> type ipconfig /all and press Enter-> The Physical Address is the MAC address.


2 Answers

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();
    }
}
like image 109
Dominic Jonas Avatar answered Sep 28 '22 02:09

Dominic Jonas


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));
like image 39
jop Avatar answered Sep 28 '22 03:09

jop