我需要列出LAN中所有连接的主机的IP地址。执行此操作的最简单方法是什么?
发布于 2010-10-28 20:26:29
你得做个ping扫描。在System.Net名称空间中有一个Ping类。示例如下。此外,只有当您的计算机没有运行防火墙时,这才是可能的。如果他们启用了防火墙,那么除了在您的交换机上执行SNMP查询之外,无法确定此信息。
System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply rep = p.Send("192.168.1.1");
if (rep.Status == System.Net.NetworkInformation.IPStatus.Success)
{
//host is active
}
另一个问题是确定你的网络有多大。在大多数家庭情况下,您的网络掩码将是24位。这意味着它被设置为255.255.255.0。如果您的网关是192.168.1.1,这意味着您网络上的有效地址将是192.168.1.1到192.168.1.254。这里有一个IP Calculator可以提供帮助。您必须遍历每个地址,并使用ping类对地址执行Ping操作,然后检查PingReply。
如果你只是在寻找信息,而不关心如何获得它,你可以使用NMap。该命令将如下所示
nmap -sP 192.168.1.0/24
编辑:
就速度而言,由于您是在本地网络上,您可以大大缩短超时间隔,因为您的机器响应时间不应超过100毫秒。您还可以使用SendAsync并行地对它们执行ping操作。下面的程序将在半秒内ping 254地址。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;
using System.Diagnostics;
using System.Net;
using System.Threading;
using System.Net.Sockets;
namespace ConsoleApplication1
{
class Program
{
static CountdownEvent countdown;
static int upCount = 0;
static object lockObj = new object();
const bool resolveNames = true;
static void Main(string[] args)
{
countdown = new CountdownEvent(1);
Stopwatch sw = new Stopwatch();
sw.Start();
string ipBase = "10.22.4.";
for (int i = 1; i < 255; i++)
{
string ip = ipBase + i.ToString();
Ping p = new Ping();
p.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);
countdown.AddCount();
p.SendAsync(ip, 100, ip);
}
countdown.Signal();
countdown.Wait();
sw.Stop();
TimeSpan span = new TimeSpan(sw.ElapsedTicks);
Console.WriteLine("Took {0} milliseconds. {1} hosts active.", sw.ElapsedMilliseconds, upCount);
Console.ReadLine();
}
static void p_PingCompleted(object sender, PingCompletedEventArgs e)
{
string ip = (string)e.UserState;
if (e.Reply != null && e.Reply.Status == IPStatus.Success)
{
if (resolveNames)
{
string name;
try
{
IPHostEntry hostEntry = Dns.GetHostEntry(ip);
name = hostEntry.HostName;
}
catch (SocketException ex)
{
name = "?";
}
Console.WriteLine("{0} ({1}) is up: ({2} ms)", ip, name, e.Reply.RoundtripTime);
}
else
{
Console.WriteLine("{0} is up: ({1} ms)", ip, e.Reply.RoundtripTime);
}
lock(lockObj)
{
upCount++;
}
}
else if (e.Reply == null)
{
Console.WriteLine("Pinging {0} failed. (Null Reply object?)", ip);
}
countdown.Signal();
}
}
}
编辑:在我自己使用它之后,我修改了程序,输出了有多少个IP响应。有一个const
布尔值,如果设置为true,将导致程序解析IP的主机名。不过,这会显著减慢扫描速度。(不到半秒到16秒)还发现,如果IP地址指定不正确(我自己也犯了一个打字错误),回复对象可能为空,所以我对此进行了处理。
发布于 2010-10-28 20:23:24
您需要构建一个地址范围(例如192.168.0.1 - 192.168.255.254)并对每个地址执行ping操作。如果收到响应,则该主机处于活动状态。
异步Ping教程:
http://www.geekpedia.com/tutorial234_Asynchronous-Ping-using-Csharp.html
但是,一些较新的操作系统会阻止ping请求(ICMP)。需要在每台计算机的防火墙中禁用此功能,您才能收到响应。
发布于 2010-10-28 20:21:47
您可以对地址范围执行ping操作,并注意主机是否响应。当然,这需要主机响应ping数据包。
https://stackoverflow.com/questions/4042789
复制相似问题