从C#开始,我想做与以下相同的事情:
arp -a |findstr 192.168.1.254
或者,答案可以调用SendARP函数并获得结果。
这将允许我的应用程序执行一些需要MAC地址的其他处理。
答案 0 :(得分:25)
SendARP P / Invoke是这样的:
[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));
答案 1 :(得分:2)
这是我的解决方案。
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();
}
}
答案 2 :(得分:1)
进入WMI子系统。一些正确方向的VBScript代码是here
答案 3 :(得分:1)
找到你自己的:
添加对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());
}
不确定是否找到了另一台设备。