SendARP P/Gọi đi như thế này:
[DllImport("iphlpapi.dll", ExactSpelling=true)]
public static extern int SendARP(int destIp, int srcIP, byte[] macAddr, ref uint physicalAddrLen);
PInvoke.NET có ví dụ này:
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));
Những điều cần biết về câu trả lời này mà tôi khám phá ra trong khi thử nghiệm trên Windows XP sử dụng Wireshark: 1) Nếu cặp địa chỉ IP/MAC là đã có trong bộ nhớ cache ARP, yêu cầu gói ARP sẽ KHÔNG được gửi đi trên mạng, nhưng SendARP vẫn sẽ trả về macAddress (tiềm năng cũ) có trong bộ nhớ cache của nó. 2) Phương pháp này có khả năng rất chậm nếu chỉ sử dụng một chuỗi duy nhất. Looping thông qua một subnet đầy đủ của địa chỉ IP (ví dụ 192.168.1.x) sử dụng một thread đơn mất 250 + giây (1 giây cho mỗi địa chỉ IP.) Làm cho nó ồ ạt đa luồng mất ít hơn một giây cho tất cả 250 địa chỉ. – Pretzel