encontrar todas las direcciones IP en una red

Estoy tratando de hacer esto C #. Necesito encontrar todas las direcciones IP que están activas en mi red y mostrarlas en una lista. Puedo hacer ping a todas las direcciones IP disponibles (1 … 255) en una red. Pero quiero hacer que este proceso sea más rápido.

Este código escanea mi red 255 segmentos clase D en aproximadamente 1 segundo. Lo escribí en VB.net y lo traduje a C # (disculpas si hay algún error). Pégalo en un proyecto de consola y ejecútalo. Modificar según sea necesario.

Nota: El código no está listo para producción y necesita mejoras especialmente en el conteo de instancias (intente implementar una TaskFactory con un BlockingCollection lugar).

Modifique ttl (time-to-live) y timeout si es inestable en cuanto a los resultados.

Ejecutar el código dará un resultado como este:

 Pinging 255 destinations of D-class in 192.168.1.* Active IP: 192.168.1.100 Active IP: 192.168.1.1 Finished in 00:00:00.7226731. Found 2 active IP-addresses. 

C # code:

 using System.Net.NetworkInformation; using System.Threading; using System.Diagnostics; using System.Collections.Generic; using System; static class Module1 { private static List pingers = new List(); private static int instances = 0; private static object @lock = new object(); private static int result = 0; private static int timeOut = 250; private static int ttl = 5; public static void Main() { string baseIP = "192.168.1."; Console.WriteLine("Pinging 255 destinations of D-class in {0}*", baseIP); CreatePingers(255); PingOptions po = new PingOptions(ttl, true); System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); byte[] data = enc.GetBytes("abababababababababababababababab"); SpinWait wait = new SpinWait(); int cnt = 1; Stopwatch watch = Stopwatch.StartNew(); foreach (Ping p in pingers) { lock (@lock) { instances += 1; } p.SendAsync(string.Concat(baseIP, cnt.ToString()), timeOut, data, po); cnt += 1; } while (instances > 0) { wait.SpinOnce(); } watch.Stop(); DestroyPingers(); Console.WriteLine("Finished in {0}. Found {1} active IP-addresses.", watch.Elapsed.ToString(), result); Console.ReadKey(); } public static void Ping_completed(object s, PingCompletedEventArgs e) { lock (@lock) { instances -= 1; } if (e.Reply.Status == IPStatus.Success) { Console.WriteLine(string.Concat("Active IP: ", e.Reply.Address.ToString())); result += 1; } else { //Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString())) } } private static void CreatePingers(int cnt) { for (int i = 1; i <= cnt; i++) { Ping p = new Ping(); p.PingCompleted += Ping_completed; pingers.Add(p); } } private static void DestroyPingers() { foreach (Ping p in pingers) { p.PingCompleted -= Ping_completed; p.Dispose(); } pingers.Clear(); } } 

Y el código de VB.net:

 Imports System.Net.NetworkInformation Imports System.Threading Module Module1 Private pingers As New List(Of Ping) Private instances As Integer = 0 Private lock As New Object Private result As Integer = 0 Private timeOut As Integer = 250 Private ttl As Integer = 5 Sub Main() Dim baseIP As String = "192.168.1." Dim classD As Integer = 1 Console.WriteLine("Pinging 255 destinations of D-class in {0}*", baseIP) CreatePingers(255) Dim po As New PingOptions(ttl, True) Dim enc As New System.Text.ASCIIEncoding Dim data As Byte() = enc.GetBytes("abababababababababababababababab") Dim wait As New SpinWait Dim cnt As Integer = 1 Dim watch As Stopwatch = Stopwatch.StartNew For Each p As Ping In pingers SyncLock lock instances += 1 End SyncLock p.SendAsync(String.Concat(baseIP, cnt.ToString()), timeOut, data, po) cnt += 1 Next Do While instances > 0 wait.SpinOnce() Loop watch.Stop() DestroyPingers() Console.WriteLine("Finished in {0}. Found {1} active IP-addresses.", watch.Elapsed.ToString(), result) Console.ReadKey() End Sub Sub Ping_completed(s As Object, e As PingCompletedEventArgs) SyncLock lock instances -= 1 End SyncLock If e.Reply.Status = IPStatus.Success Then Console.WriteLine(String.Concat("Active IP: ", e.Reply.Address.ToString())) result += 1 Else 'Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString())) End If End Sub Private Sub CreatePingers(cnt As Integer) For i As Integer = 1 To cnt Dim p As New Ping AddHandler p.PingCompleted, AddressOf Ping_completed pingers.Add(p) Next End Sub Private Sub DestroyPingers() For Each p As Ping In pingers RemoveHandler p.PingCompleted, AddressOf Ping_completed p.Dispose() Next pingers.Clear() End Sub End Module 

Consulte este enlace sobre el socket de cliente asíncrono para aprender a hacer ping más rápido.

Editar: Un fragmento rápido sobre cómo lograr esto:

 private static void StartClient() { // Connect to a remote device. try { // Establish the remote endpoint for the socket. // The name of the // remote device is "host.contoso.com". IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com"); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); // Create a TCP/IP socket. Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Connect to the remote endpoint. client.BeginConnect( remoteEP, new AsyncCallback(ConnectCallback), client); connectDone.WaitOne(); // Send test data to the remote device. Send(client,"This is a test"); sendDone.WaitOne(); // Receive the response from the remote device. Receive(client); receiveDone.WaitOne(); // Write the response to the console. Console.WriteLine("Response received : {0}", response); // Release the socket. client.Shutdown(SocketShutdown.Both); client.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } 

Tomado de esta documentación de Microsoft.

  public static void NetPing() { Ping pingSender = new Ping(); foreach (string adr in stringAddressList) { IPAddress address = IPAddress.Parse(adr); PingReply reply = pingSender.Send (address); if (reply.Status == IPStatus.Success) { //Computer is active } else { //Computer is down } } } 

si desea ir a la ruta ARP, puede simplemente enviar solicitudes ARP para todas las direcciones, esperar un poco y buscar en la tabla ARP de su host

esto puede ayudar

http://www.codeguru.com/cpp/in/internet/internetprotocolip/article.php/c6153/How-to-Get-an-ARP-Table-with-an-IP-Helper-API.htm

http://www.advanced-ip-scanner.com/ . esta es una herramienta que puede usar para ver qué ip está activa en su red. también qué tipo de hardware de red usa la PC.