VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 902|回复: 9

C#查询交换机的方法

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-5 22:00:01 | 显示全部楼层 |阅读模式
大家好:
    以前我用255个线程扫描局域网主机,功能是实现了,但是,速度不快!我想用C#直接查询交换机的方法来获取局域网主机信息,怎么样能实现呢?望各位大虾指点!小弟不胜感激!
回复

使用道具 举报

0

主题

16

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-5-23 12:45:01 | 显示全部楼层
除非交换机厂商预留这个功能接口给你,不然基本没指望的。
如果你的交换机够高级的话直接telnet到交换机上查看mac table,会有一些基本信息的,应该能满足你。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-5-24 11:15:01 | 显示全部楼层
能不能把你用255个线程扫描局域网主机的代码贴出来?学习学习!
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-17 16:30:01 | 显示全部楼层
我做的是一个局域网信息交流工具,代码很多,为了讨论需要,我只是摘取多线程扫描局域网IP部分和大家讨论!程序肯定不优化,希望大家别嘲笑在下!

private void GetLanHost()
{
        //获取局域网主机,并加入到 ComboBox1中
        //tempLocalIP = Dns.GetHostByName(LocalHostName).AddressList[0].ToString();
        //此处不直接使用“LocalHostIp”是因为,它在后面可能有变化!故而用tempLocalIP;
        strLanIpFront = tempLocalIP.Substring(0,tempLocalIP.LastIndexOf("."));//取出本地IP地址的前三段
        comboBox1.Text= "";
        comboBox1.Items.Clear();
        MyThread = new Thread[255];
        for(int i=0;i<255;i++)//启用255个线程扫描局域网主机IP,及机器名
        {
                MyThread[i] = new Thread(new ThreadStart(Scan));
                MyThread[i].Name = i.ToString();
                MyThread[i].Start();
                if(!MyThread[i].Join(120))
                {
                        MyThread[i].Abort();
                }
        }
}

private void Scan()
{
        //扫描LAN_IP的方法
        IPAddress LanIp = IPAddress.Parse(strLanIpFront + "." + Thread.CurrentThread.Name.ToString());
        IPHostEntry LanHostDns = null;
        //此处不直接使用“LocalHostIp”是因为,它在后面可能有变化!故而用tempLocalIP;
        if(LanIp.ToString() != tempLocalIP) //不扫描本机
        {
                try
                {
                        LanHostDns = Dns.GetHostByAddress(LanIp);
                        lock(comboBox1)
                        {
                                comboBox1.Items.Add("LAN:" + LanIp.ToString() + "(" + LanHostDns.HostName.ToString() + ")");
                        }
                }
                catch
                        {}
        }
}
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-17 21:15:01 | 显示全部楼层
哪有这样扫描的,一般用arp扫描,一秒钟可以全扫描到
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-8-6 10:15:01 | 显示全部楼层
arp扫描?好啊!朋友,能给出示例代码吗?谢谢!
回复

使用道具 举报

0

主题

16

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-8-6 11:30:01 | 显示全部楼层
arp扫描?
没听说过啊,算我不懂arp协议,说来听听...
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-6 14:15:01 | 显示全部楼层
交换机支持http方式查询的话干脆冒充浏览器直接去取这一页,然后分析得到的HTML
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-7 13:00:01 | 显示全部楼层
下面的做法参考一下。另外不需要255个线程,有一个线程扫描就可以了。255个线程光创建和调度就要消耗很多系统资源,可能是性能不高的一个原因哦!

        public class CLsArp
        {
                #region APIs
                [DllImport("iphlpapi.dll", CallingConvention = CallingConvention.Cdecl)]
                private static extern Int32 SendARP(UInt32 udwDestIP,UInt32 udwSrcIP,byte[] pMacAddr,ref Int32 PhyAddrLen);

                private const Int32 NUMBER_OF_PHYSICAL_ADDRESS_BYTES = 6;
                #endregion

                public CLsArp()
                {
                }

                public static byte[] GetComputerMacAddr(UInt32 dwIP)
                {
                        byte[] abMacAddr = null;

                        Int32 dwPhyAddrLen = 0;
                       
                        try
                        {
                                abMacAddr = new byte[NUMBER_OF_PHYSICAL_ADDRESS_BYTES];
                                dwPhyAddrLen = abMacAddr.Length;

                                if (SendARP(dwIP,0,abMacAddr, ref dwPhyAddrLen) != 0)
                                {
                                        //Get Error!Reset byte array to null
                                        abMacAddr = null;
                                }
                        }
                        catch
                        {
                                abMacAddr = null;
                        }

                        return abMacAddr;
                }
        }
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-8 15:00:01 | 显示全部楼层
不懂就在网上搜,这协议是公开的,又不是秘密,至于如何发送arp协议数据,建议你用winpcap的函数库,免费开原的,codeproject上有对winpcap的c#包装类库,很方便,对一个机子发送arp请求包,如果它开机并在网络上的话,会立即向你发送一个应答包,可以根据收到的应答包来搜索所有的机器,由于绝大部分防火墙没有拦截arp协议的功能,所以这个方法可以穿透防火墙,效果最好。





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表