2012-11-21 104 views
9

Tôi đang cố gắng thực hiện điều này C#. Tôi cần phải tìm tất cả địa chỉ ip đang hoạt động trong mạng của tôi và hiển thị chúng trong một danh sách. Tôi có thể ping tất cả có sẵn (1 ... 255) địa chỉ ip trong một mạng. Nhưng tôi muốn làm cho quá trình này nhanh hơn.tìm tất cả địa chỉ ip trong mạng

+1

Nếu bạn muốn làm cho nó nhanh hơn, ping tất cả các IP cùng một lúc: 'Ping.SendAsync'. – igrimpe

+0

Tôi vừa chạy lệnh pinging như thế này 'for/l% n in (1,1,255) làm ping 192.168.10.% X' với process.start() và sau đó đọc mục nhập bảng arp tìm mỗi ip địa chỉ trong mạng. nhưng điều này rất chậm. Cần phải thực hiện nhanh chóng. –

+0

@MehbubeArman, có bao nhiêu địa chỉ IP có thể trong mạng và "đủ nhanh" –

Trả lời

1

Vui lòng tham khảo This link về Ổ cắm khách hàng không đồng bộ để tìm hiểu cách ping nhanh hơn.

Edit: Một đoạn nhanh về cách thực hiện điều này:

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

Taken từ this Microsoft documentation.

+0

cảm ơn NewAmbition. Nhưng tôi đã tìm kiếm một cách thay thế để ping tất cả –

+1

tại sao bạn lại tìm kiếm một giải pháp thay thế? (Thậm chí sau đó, bạn không bao giờ nói rằng trong câu hỏi của bạn) - Pinging sẽ cho phép bạn xem nếu một IP là lên hay không .. – TheGeekZn

+2

Nếu không có điểm trung tâm tham chiếu như máy chủ tên miền/máy chủ dns mà máy chủ đăng ký, bạn sẽ phải liên hệ với tất cả địa chỉ ứng viên và xem có điều gì ở đó không, ping là cách để thực hiện điều này. –

-1

http://www.advanced-ip-scanner.com/. đây là một công cụ bạn có thể sử dụng để xem những gì ip đang hoạt động trên mạng của bạn. cũng loại phần cứng mạng mà PC sử dụng.

+0

Thực ra tôi đang tìm kiếm một giải pháp liên quan đến lập trình –

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

Mã này quét mạng của tôi 255 phân đoạn loại D trong khoảng 1 giây. Tôi đã viết nó trong VB.net và dịch nó sang C# (xin lỗi nếu có bất kỳ lỗi nào). Dán nó vào một dự án Console và chạy. Sửa đổi khi cần.

Lưu ý: Mã này là không sản xuất sẵn sàng và cần cải tiến trên đặc biệt là các trường hợp đếm (thử thực hiện một TaskFactory với một BlockingCollection thay).

Sửa đổi ttl (thời gian chờ) và hết thời gian chờ nếu kết quả không ổn định.

Chạy mã sẽ cho một kết quả như thế này:

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(); 

    } 

} 

Và VB.net mã:

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

nếu bạn muốn đi Tuyến đường ARP, bạn có thể chỉ cần gửi yêu cầu ARP cho tất cả các địa chỉ, đợi một chút và xem bảng ARP của máy chủ lưu trữ của bạn

này có thể giúp

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

để bạn hạn chế giải pháp cho các máy chủ được kết nối với mạng con của mình ??? –

+1

mà dường như là những gì anh ấy muốn làm và cũng cần phải nhanh chóng. –

+0

câu hỏi của ông là không rõ ràng và giải pháp này cung cấp ít hơn pinging –

Các vấn đề liên quan