從C#,我想做以下等效:如何使用C#獲取IP地址的物理(MAC)地址?
arp -a |findstr 192.168.1.254
或者,答案可以調用SendARP功能,獲得滿意的結果。
這將允許我的應用程序做一些其他需要MAC地址的處理。
從C#,我想做以下等效:如何使用C#獲取IP地址的物理(MAC)地址?
arp -a |findstr 192.168.1.254
或者,答案可以調用SendARP功能,獲得滿意的結果。
這將允許我的應用程序做一些其他需要MAC地址的處理。
SendARP P /調用是這樣的:
[DllImport("iphlpapi.dll", ExactSpelling=true)]
public static extern int SendARP(int destIp, int srcIP, byte[] macAddr, ref uint physicalAddrLen);
PInvoke.NET具有這個例子:
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));
鉤入WMI子系統。一些VBScript代碼以獲得正確的方向前進是here
要找出你自己:
添加一個參考System.Management
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection mcCol = mc.GetInstances();
foreach (ManagementObject mcObj in mcCol)
{
Console.WriteLine(mcObj["Caption"].ToString());
Console.WriteLine(mcObj["MacAddress"].ToString());
}
不知道要找到另一個設備。
這是我的解決方案。
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();
}
}
僅當使用IP地址時才返回有效的Mac地址,而使用主機名時MAC地址錯誤。 – 2017-03-27 06:28:12
事情知道這個答案,我在使用Wireshark的Windows XP上測試發現: 1)如果IP/MAC地址對已存在的ARP緩存,ARP請求報文會不會出上發送網絡,但SendARP仍然會返回它的緩存中的(可能過時的)macAddress。 2)如果僅使用單個線程,此方法可能非常慢。使用單線程遍歷IP地址的完整子網(例如192.168.1.x)花費了250+秒(每個IP地址1秒)。對於所有250個以上的地址,大規模地使用多線程需要不到一秒的時間。 – Pretzel 2009-07-20 18:23:13