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
Trả lời
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.
cảm ơn NewAmbition. Nhưng tôi đã tìm kiếm một cách thay thế để ping tất cả –
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
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. –
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.
Thực ra tôi đang tìm kiếm một giải pháp liên quan đến lập trình –
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
}
}
}
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
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
để 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 ??? –
mà dường như là những gì anh ấy muốn làm và cũng cần phải nhanh chóng. –
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 –
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
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. –
@MehbubeArman, có bao nhiêu địa chỉ IP có thể trong mạng và "đủ nhanh" –