用C#获取局域网内所有IP方法研究

本文详细介绍了使用C#获取局域网内所有IP的多种方法,包括使用DirectoryEntry方法、ping方法、Dns.GetHostByAddress方法以及获取远程IP的MAC地址的方法。同时提供了实验结果的分析。
摘要由CSDN通过智能技术生成
用C#获取局域网内所有IP方法研究 (2011-05-19 13:10:29)转载 标签: 局域网 ip 分类: C#

一、微软推荐的DirectoryEntry方法

关键引用 using System.DirectoryServices;
核心代码:

public static string ReadMac(string ip)//传递IP地址,即可返回MAC地址
{
string mac = "";
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "nbtstat";
p.StartInfo.Arguments = "-a " + ip;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
string output = p.StandardOutput.ReadToEnd();
int len = output.IndexOf("MAC Address = ");
if (len > 0)
{
mac = output.Substring(len + 14, 17);
}
p.WaitForExit();
return mac;
}

public void GetIPAddress()
{
DirectoryEntry entryPC = new DirectoryEntry("WinNT:");
ArrayList arr = new ArrayList();
foreach (DirectoryEntry child in entryPC.Children)
{
TreeNode node = new TreeNode();
node.Text = child.SchemaClassName + ":" + child.Name;
PCTree.Nodes.Add(node);

foreach (DirectoryEntry pc in child.Children)
{
if (String.Compare(pc.SchemaClassName, "computer", true) == 0)
{
TreeNode son = new TreeNode();
//son.Text = pc.Name;
try
{
IPHostEntry hostent = Dns.GetHostByName(pc.Name); // 主机信息
Array addrs = hostent.AddressList; // IP地址数组
IEnumerator it = addrs.GetEnumerator(); // 迭代器
while (it.MoveNext())
{
// 循环到下一个IP 地址
IPAddress ip = (IPAddress)it.Current; // 获得 IP 地址
son.Text = ip.ToString(); // 显示 IP地址
arr.Add(ReadMac(ip.ToString()));
}
}
catch
{
son.Text = pc.Name;
}
node.Nodes.Add(son);
}
}
}
foreach (string s in arr)
{
this.listBox1.Items.Add(s);
}
}


//用指定的文本构造一个节点,将其添加为参数parant的子节点,并返回刚构造的节点
private TreeNode AddNode(TreeNode parant, string text)
{
TreeNode node = new TreeNode(text);
parant.Nodes.Add(node);
return node;
}

//递归地找到参数entry的所有子节点,并在treeView1中显示;这里的entry与entryNode需相对应
private void EnumChildren(DirectoryEntry entry, TreeNode entryNode)
{
if (entry.Children != null) //如果无子节点则结束
{
foreach (DirectoryEntry i in entry.Children)
{
//将各子节点加入TreeView,并进行递归
EnumChildren(i, AddNode(entryNode, i.Name));
}
}
}

//用给定的字符串构造根节点,并列出其所有子节点
private void Enumerate(string path)
{
try
{
using (DirectoryEntry root = new DirectoryEntry(path))
{
TreeNode node = new TreeNode(root.Name);
treeView1.Nodes.Add(node);
EnumChildren(root, node);
}
}
catch { }
}

实验结果:一般都没有结果,呵呵!你不妨也试试。

二、ping的办法

关键引用:using System.Diagnostics;
核心代码:

private void EnumComputers()
{
try
{
for (int i = 1; i <= 255; i++)
{
Ping myPing;
myPing = new Ping();
myPing.PingCompleted += new PingCompletedEventHandler(_myPing_PingCompleted);

string pingIP = "192.168.1." + i.ToString();
myPing.SendAsync(pingIP, 1000, null);
}
}
catch
{
}
}

private void _myPing_PingCompleted(object sender, PingCompletedEventArgs e)
{
string rsl = e.Reply.Address.ToString();
if (e.Reply.Status == IPStatus.Success)
{
rsl += " " + GetMacAddress(e.Reply.Address.ToString());
this.listBox1.Items.Add(rsl);
}
}

实验结果:可以得到一般的IP,但不是所有。因为有些计算机经常PING不到啊。

三、Dns.GetHostByAddress的方法

核心代码:
private void button6_Click(object sender, EventArgs e)
{
string strip = "192.168.1.";
for (int i = 1; i < 256; i++) //循环扫描的IP
{
string bsip = strip + i.ToString(); //一个要扫描的完整的IP地址
IPAddress ip = IPAddress.Parse(bsip); //将字符的地址转换
try
{
IPHostEntry iphost = Dns.GetHostByAddress(ip); //通过IP获取主机信息
if (iphost != null)
{
string hostname = iphost.HostName; //主机名
listBox1.Items.Add(hostname.ToString()); //显示出扫描到的主机名和IP
}
}
catch (Exception ex) //网络上不存在IP会出错 跳过出错
{
}

}
}

实验结果:完全不行!

四、可靠的办法,但是需要多线程加以处理

以下代码是可靠的途径,缺点是速度非常慢;解决方法:多线程(255个线程也可以啊);

[DllImport("ws2_32.dll")]
private static extern int inet_addr(string cp);
[DllImport("IPHLPAPI.dll")]
private static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 pMacAddr, ref Int32 PhyAddrLen);

/// <summary>
/// 获取远程IP(不能跨网段)的MAC地址
/// </summary>
/// <param name="hostip"></param>
/// <returns></returns>
private string GetMacAddress(string hostip)
{
string Mac = "";
try
{
//将IP地址从 点数格式转换成无符号长整型
Int32 ldest = inet_addr(hostip);
Int64 macinfo = new Int64();
Int32 len = 6;
SendARP(ldest, 0, ref macinfo, ref len);
//转换成16进制,注意有些没有十二位
string TmpMac = Convert.ToString(macinfo, 16).PadLeft(12, '0');
Mac = TmpMac.Substring(0, 2).ToUpper();
for (int i = 2; i < TmpMac.Length; i = i + 2)
{
Mac = TmpMac.Substring(i, 2).ToUpper() + "-" + Mac;
}
}
catch (Exception Mye)
{
Mac = "获取远程主机的MAC错误:" + Mye.Message;
}
return Mac;
}

private void button7_Click(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值