2012-11-21 3 views
9

Ich versuche, diese C# zu tun. Ich muss alle IP-Adressen finden, die in meinem Netzwerk aktiv sind, und sie in einer Liste anzeigen. Ich kann ping alle verfügbaren (1 ... 255) IP-Adresse in einem Netzwerk. Aber ich möchte diesen Prozess beschleunigen.finden Sie alle IP-Adresse in einem Netzwerk

+1

Wenn Sie es schneller machen wollen helfen kann, ping alle IPs zugleich: 'Ping.SendAsync'. – igrimpe

+0

Ich habe gerade einen Befehl von ping wie folgt 'für/l% n in (1,1,255) tun ping 192.168.10.% X' mit process.start() und später später lesen Sie die Arp-Tabelle Eintrag finden Sie jede ip Adresse im Netzwerk. aber das ist sehr langsam. Müssen Sie das schnell machen. –

+0

@MehbubeArman, wie viele IP-Adressen sind im Netzwerk möglich und was ist "schnell genug" –

Antwort

1

Informationen zum asynchronen Client-Socket finden Sie unter This link, um zu erfahren, wie Sie schneller pingen können.

Edit: Ein kurzer Schnipsel auf, wie dies zu tun:

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<EOF>"); 
      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()); 
     } 
    } 

Entnommen this Microsoft documentation.

+0

danke NewAmbition. Aber ich suchte nach einer Alternative zum Klingeln aller –

+1

Warum suchen Sie nach einer Alternative? (Selbst dann hast du das nie in deiner Frage gesagt) - Mit Pinging kannst du sehen, ob eine IP aktiv ist oder nicht. – TheGeekZn

+2

Wenn es keinen zentralen Bezugspunkt wie einen Domänenserver/DNS-Server gibt, mit dem sich Hosts registrieren, müssen Sie alle Kandidatenadressen erreichen und sehen, ob dort etwas vorhanden ist, ping ist die Möglichkeit, dies zu tun. –

-1

http://www.advanced-ip-scanner.com/. Dies ist ein Tool, mit dem Sie sehen können, welche IPs in Ihrem Netzwerk aktiv sind. auch welche Art von Netzwerk-Hardware, die PC verwendet.

+0

Eigentlich war ich auf der Suche nach einer Lösung, die die Programmierung –

0
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 
      } 
     } 
    } 
10

Dieser Code scannt mein Netzwerk 255 D-Klasse-Segmente in etwa 1 Sekunde. Ich schrieb es in VB.net und übersetzte es in C# (Entschuldigung, wenn es irgendwelche Fehler gibt). Fügen Sie es in ein Konsolenprojekt ein und führen Sie es aus. Ändern Sie nach Bedarf.

Hinweis: Der Code ist nicht Produktion bereit und müssen Verbesserungen vor allem die Instanz zu zählen (versuchen Sie implementieren eine TaskFactory mit einem BlockingCollection statt).

Modify ttl (time-to-live) und Timeout, wenn ergebnismäßig instabil.

Ausführen des Codes wird ein Ergebnis wie dieses geben:

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<Ping> pingers = new List<Ping>(); 
    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(); 

    } 

} 

Und VB.net Code:

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 
0

, wenn Sie wollen, dass die gehen ARP-Route, können Sie einfach ARP-Anfragen für alle Adressen senden, warten Sie ein wenig und schauen Sie in die ARP-Tabelle Ihres Hosts

diese

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

+0

umfasst, so dass Sie die Lösung auf Hosts beschränken, die mit seinem Subnetz verbunden sind ??? –

+1

das scheint zu sein, was er will, und es sollte auch schnell sein. –

+0

seine Frage ist unklar und diese Lösung bietet wenig mehr als Ping –