我正在尝试让我的Android设备认为我是路由器,在C#中使用简单的ARP请求(使用C#将笔记本电脑中的arp发送到我的Android设备)。 我想如果我将使用SendArp方法(来自Iphlpapi.dll),它可以工作:
SendArp(ConvertIPToInt32(IPAddress.Parse("myAndroidIP")),
ConvertIPToInt32(IPAddress.Parse("192.168.1.1")), macAddr, ref macAddrLen)
但是我无法发送请求。*但是,如果我写'0'而不是ConvertIPToInt32(IPAddress.Parse("192.168.1.1"))
:
SendArp(ConvertIPToInt32(IPAddress.Parse("myAndroidIP")), 0,
macAddr, ref macAddrLen)
它会起作用:
因此,如果源ip为'0',则它正在工作,但如果源是路由器IP地址,则为NOT。
我正在使用此pinvoke方法发送ARP:
[System.Runtime.InteropServices.DllImport("Iphlpapi.dll", EntryPoint = "SendARP")]
internal extern static Int32 SendArp(Int32 destIpAddress, Int32 srcIpAddress,
byte[] macAddress, ref Int32 macAddressLength);
此方法将字符串IP转换为Int32:
private static Int32 ConvertIPToInt32(IPAddress pIPAddr)
{
byte[] lByteAddress = pIPAddr.GetAddressBytes();
return BitConverter.ToInt32(lByteAddress, 0);
}
谢谢。
答案 0 :(得分:1)
我认为你误解了第二个参数的含义。
1)ARP请求不是发送给特定的IP(例如Android设备),而是广播给网络的所有计算机。
2)看一下SendARP function的描述,第二个参数是接口IP,而不是目标IP。如果我理解正确,如果您的计算机中有多个局域网卡,则可以选择一个将发送ARP请求的局域网卡
SrcIP [in]发件人的源IPv4地址,格式为 IPAddr结构。此参数是可选的,用于选择 接口,用于发送ARP条目的请求。来电者可以 为此指定与INADDR_ANY IPv4地址对应的零 参数。
答案 1 :(得分:0)
这是我使用的方法,似乎没有问题。
如其他答案所述,第二个参数是源IP的选择。
将其设置为0只会使用您计算机上的任何界面。
//You'll need this pinvoke signature as it is not part of the .Net framework
[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP,
byte[] pMacAddr, ref uint PhyAddrLen);
//These vars are needed, if the the request was a success
//the MAC address of the host is returned in macAddr
private byte[] macAddr = new byte[6];
private uint macAddrLen;
//Here you can put the IP that should be checked
private IPAddress Destination = IPAddress.Parse("127.0.0.1");
//Send Request and check if the host is there
if (SendARP((int)Destination.Address, 0, macAddr, ref macAddrLen) == 0)
{
//SUCCESS! Igor it's alive!
}