如何高效实现扫描局域网IP、主机名、MAC和端口

您所在的位置:网站首页 cmd扫描ip 如何高效实现扫描局域网IP、主机名、MAC和端口

如何高效实现扫描局域网IP、主机名、MAC和端口

2023-08-09 16:30| 来源: 网络整理| 查看: 265

   近几年工作经常使用RFID识读器,智能家居网关,温湿度传感器、串口服务器、视频编码器等,一般是有串口和网口,由于现场原因一般较少使用串口,大多使用网口。连接方法是IP地址和端口,有的设备带搜索软件,有的就不带。经常测试环境和现场来回用,难免记混。同时使用网上的一些端口扫描工具,发现有一个问题,就是在进行扫描的时候,不怎么好用,比如,扫描器一般都是带端口扫描的,但是,我仅仅只用扫描设备在不在线,不用扫描端口,但是有一些设备是只要扫描端口,这个怎么更方便更好用呢?

   同时在扫描成功之后,需要通过TCP连接到设备,发数据,看数据能不能正常相应,或者设备状态对不对,这是不是又要单独开另外一个软件?使用起来,比较繁琐,因此就根据自己的需要制作了一个小工具,用来扫描IP和端口。

 扫描速度一定要快,成功和不成功区分要明显,好了,先上图:

 

一、主要IP扫描方法:

(1)、IP地址匹配,看IP设置是否正确

//匹配正确的IP地址 Regex rgx = new Regex(@"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$"); if (rgx.IsMatch(IPStarttextBox.Text) && rgx.IsMatch(IPStoptextBox.Text))//匹配正确IP { if (scan_type == 1) { int startIp = Int32.Parse(IPStarttextBox.Text.Split('.')[3]); int endIp = Int32.Parse(IPStoptextBox.Text.Split('.')[3]); progressBar.Minimum = startIp; progressBar.Maximum = endIp; } else { if (PortStarttextBox.Text == "") { MessageBox.Show("请输入端口号!"); } else { portStart = Int32.Parse(PortStarttextBox.Text); portEnd = Int32.Parse(PortEndtextBox.Text); progressBar.Minimum = portStart; progressBar.Maximum = portEnd; } if (portEnd < portStart) { MessageBox.Show("请填写正确端口范围"); return; } } } else { MessageBox.Show("请填写正确IP"); return; }

 (2)、获取主机名

public static string GetHostEntry(object ip) { string hostname = "-"; try { IPHostEntry host = Dns.GetHostEntry(ip.ToString()); hostname = host.HostName; } catch(Exception ex) { Console.WriteLine(ex.ToString()); } return hostname; }

(3)、获取MAC地址

[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); private string GetMacAddress(string hostip)//获取远程IP(不能跨网段)的MAC地址 { string Mac = ""; try { Int32 ldest = inet_addr(hostip); //将IP地址从 点数格式转换成无符号长整型 Int64 macinfo = new Int64(); Int32 len = 6; SendARP(ldest, 0, ref macinfo, ref len); string TmpMac = Convert.ToString(macinfo, 16).PadLeft(12, '0');//转换成16进制  注意有些没有十二位 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; }

(3)、主要准备工作做好了,接下来,进入主题,如何通过多线程判断IP是否在线。

Thread waitT = new Thread(new ThreadStart(ipwait)); waitT.Start();//等待所有线程执行完毕在写入textbox中 public void ipwait() { int startIp = Int32.Parse(IPStarttextBox.Text.Split('.')[3]); int endIp = Int32.Parse(IPStoptextBox.Text.Split('.')[3]); ListViewItem lvi; string ip = IPStarttextBox.Text.Split('.')[0] + "." + IPStarttextBox.Text.Split('.')[1] + "." + IPStarttextBox.Text.Split('.')[2] + "."; String ipaddr = ""; int timeout = int.Parse(TimeOuttextBox.Text); string mac = ""; progressBar.Minimum = startIp; progressBar.Maximum = endIp; try { for (int q = startIp; q


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3