2

我试图让我的 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 地址,则它不是。

我正在使用这个 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);
}

谢谢你。

4

2 回答 2

2

我认为您误解了第二个参数的含义。

1)ARP请求不是发送特定IP(例如Android设备),而是广播到网络中的所有计算机。

2)看一下SendARP函数的描述,第二个参数是接口IP,不是目的IP。如果我理解正确,如果您的计算机中有多个 LAN 卡,您可以选择其中一个,它将发送 ARP 请求

SrcIP [in] 发送方的源 IPv4 地址,采用 IPAddr 结构的形式。此参数是可选的,用于选择发送 ARP 条目请求的接口。调用者可以为此参数指定对应于 INADDR_ANY IPv4 地址的零。

于 2013-06-16T12:27:03.897 回答
1

这是我使用的方法,似乎没有问题。
正如其他答案所描述的,第二个参数是源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!
}
于 2020-08-21T12:59:07.533 回答