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));
Что нужно знать об этом ответ, который я обнаружил при тестировании на Windows XP с помощью Wireshark: 1) Если адрес пары IP/MAC уже в кэше ARP, пакет запроса ARP НЕ будет отправлено на сети, но SendARP все равно вернет (потенциально устаревший) macAddress, который он имеет в своем кеше. 2) Этот метод потенциально очень медленный, если используется только один поток. Проникновение через полную подсеть IP-адресов (например, 192.168.1.x) с использованием одного потока заняло 250 + секунд (1 секунду на IP-адрес). Для массового многопоточности заняло менее секунды для всех 250 + адресов. – Pretzel 2009-07-20 18:23:13