如果你使用过P2P终结者或者类似的软件,你会发觉只要一打开就可以看到局域网内部的所有机器,而有时候我们正好有这样的需求,那我们应该怎么样用去获得局域网的所有机器呢?如果你到百度或者GOOGLE上面进行搜索你会发现,网上大致都是采用轮询的方法,让你把所有机器都扫描一遍,如果有反应则表示主机存在,但是这种办法并不可取,不仅耗资源,而且耗时间,即使你单独开一个线程去跑,估计半小时都没有任何结果。网上有人提出更加可笑的办法,说开多一些线程去检测。要知道,线程可不是省油的灯,再说,采用轮询的办法每遇到一台主机不存在就会抛出一个异常,而且该类异常一般都是超时无响应才抛出的,使用异常处理的方式来处理问题将会严重影响应用程序的性能。

这里将介绍如何利用巧妙的方式来获取局域网内所有机器:

1.先调用系统API判断网络是否处于连接状态

<转>用C#获取局域网内所有机器    [DllImport("wininet.dll")]
<转>用C#获取局域网内所有机器    private static extern bool InternetGetConnectedState(out int connectionDescription, int reservedValue);
<转>用C#获取局域网内所有机器    public static bool IsLocalConnection()
    }

2.再调用底层硬件获取本地网关地址信息


<转>用C#获取局域网内所有机器static string GetGateWayAddress()

3.分别向本地网关内机器发送ICMP数据包

<转>用C#获取局域网内所有机器bool Pinging(string addr, int id, uint taskid)

4.定义本地机器节点信息类

<转>用C#获取局域网内所有机器public class LocalMachine
5.根据arp原理,最后通过以下方式读取arp列表节点信息,其实这里还可以IMCP包响应来获取主机响应,
不过我个人认为用直接读取列表的方式更加快速有效。
<转>用C#获取局域网内所有机器static ArrayList GetAllLocalMachines()
6.最后,你还可以通过以下方法来获取网卡的MAC地址信息
[DllImport("NETAPI32.DLL")] public static extern char Netbios(ref MACAddress.NCB ncb);

<转>用C#获取局域网内所有机器public string GetMacAddress()
        if (uRetCode != '

相关文章: