public void ScanLAN(IP startIP, IP endIP) { var targetIPList = new List <IPAddress>(); while (!startIP.Equals(endIP)) { targetIPList.Add(startIP.IPAddress); startIP.AddOne(); } var arpPackets = new Packet[targetIPList.Count]; for (int i = 0; i < arpPackets.Length; ++i) { arpPackets[i] = BuildRequest(targetIPList[i], LocalMAC, LocalIP); } String arpFilter = "arp and ether dst " + LocalMAC.ToString(); _device.Open(DeviceMode.Promiscuous, 20); _device.Filter = arpFilter; scanThread = new System.Threading.Thread(() => { for (int i = 0; i < arpPackets.Length; ++i) { var lastRequestTime = DateTime.FromBinary(0); var requestInterval = new TimeSpan(0, 0, 1); var timeoutDateTime = DateTime.Now + timeout; while (DateTime.Now < timeoutDateTime) { if (requestInterval < (DateTime.Now - lastRequestTime)) { _device.SendPacket(arpPackets[i]); lastRequestTime = DateTime.Now; } var reply = _device.GetNextPacket(); if (reply == null) { continue; } var packet = PacketDotNet.Packet.ParsePacket(reply.LinkLayerType, reply.Data); var arpPacket = PacketDotNet.ARPPacket.GetEncapsulated(packet); if (arpPacket == null) { continue; } if (arpPacket.SenderProtocolAddress.Equals(targetIPList[i])) { if (ResolvedEvent != null) { ResolvedEvent(this, new ResolvedEventArgs() { IPAddress = arpPacket.SenderProtocolAddress, PhysicalAddress = arpPacket.SenderHardwareAddress }); } break; } } } _device.Close(); Console.WriteLine("exit scan"); if (ScanStopedEvent != null) { ScanStopedEvent(this, new EventArgs()); } }); scanThread.Start(); }