我知道并不是所有的设备都响应ICMP或ping,所以最合适的方法似乎是向ARP上的所有IP(从192.168.0.0到192.168.255.255)发送ARP请求,但这意味着请求超过65000个IP,这会花费很多时间。我想找到程序的另一个实例以同步其内容,但是我对ARP方法不满意。到目前为止,我在SO中找到了这些不错的代码:
[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
static void Main(string[] args)
{
List<IPAddress> ipAddressList = new List<IPAddress>();
for (int i = 0; i <= 255; i++)
{
for (int s = 0; s <= 255; s++)
{
ipAddressList.Add(IPAddress.Parse("192.168." + i + "." + s));
}
}
foreach (IPAddress ip in ipAddressList)
{
Thread thread = new Thread(() => SendArpRequest(ip));
thread.Start();
}
}
static void SendArpRequest(IPAddress dst)
{
byte[] macAddr = new byte[6];
uint macAddrLen = (uint)macAddr.Length;
int uintAddress = BitConverter.ToInt32(dst.GetAddressBytes(), 0);
if (SendARP(uintAddress, 0, macAddr, ref macAddrLen) == 0)
{
Console.WriteLine("{0} responded to ping", dst.ToString());
}
}
但是如您所见,ARP请求所有该范围将花费很长时间。在我的笔记本电脑上等待10至15分钟。当然,在大多数情况下,您可以更快地找到所需的IP,这并不是说您不是很不幸PC会落在192.168.255.255左右,但这仍然需要几分钟。这只会执行一次,因为大多数时间PC和笔记本电脑都使用首选IP,除非更改,否则这些IP将保留数天或数月,因此只要它继续使用该IP,就不需要进行另一次ARP提取。 。到目前为止,最好的选择是第一次进行这种“热启动”,并用加载屏幕来装饰它,但是我想知道是否有更快的方法来实现这一目标。另外,我只是在寻找Windows PC,因为它位于同一应用程序的实例之间。
答案 0 :(得分:5)