/// <summary> /// Listens for all ICMPv4 activity on localhost. /// /// Does this by setting a raw socket to SV_IO_ALL which /// will recieve all packets and filters to just show /// ICMP packets. Runs until ctrl-c or exit /// </summary> /// <source>https://stackoverflow.com/a/9174392</source> public void Listen() { IPAddress localAddress = null; Socket listeningSocket = null; PingResults results = new PingResults(); // Find local address localAddress = IPAddress.Parse(PowerPing.Lookup.LocalAddress()); IsRunning = true; try { // Create listener socket listeningSocket = CreateRawSocket(AddressFamily.InterNetwork); listeningSocket.Bind(new IPEndPoint(localAddress, 0)); listeningSocket.IOControl(IOControlCode.ReceiveAll, new byte[] { 1, 0, 0, 0 }, new byte[] { 1, 0, 0, 0 }); // Set SIO_RCVALL flag to socket IO control PowerPing.Display.ListenIntroMsg(); // Listening loop while (true) { byte[] buffer = new byte[4096]; // TODO: could cause overflow? // Recieve any incoming ICMPv4 packets EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); int bytesRead = listeningSocket.ReceiveFrom(buffer, ref remoteEndPoint); ICMP response = new ICMP(buffer, bytesRead); // Display captured packet PowerPing.Display.CapturedPacket(response, remoteEndPoint.ToString(), DateTime.Now.ToString("h:mm:ss.ff tt"), bytesRead); // Store results results.CountPacketType(response.type); results.Received++; if (cancelEvent.WaitOne(0)) { break; } } } catch (SocketException) { PowerPing.Display.Error("Could not read packet from socket"); results.Lost++; } catch (Exception) { PowerPing.Display.Error("General exception occured", true); } // Clean up IsRunning = false; listeningSocket.Close(); Display.ListenResults(results); }