近几年工作经常使用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(objectip)

{string hostname = "-";try{

IPHostEntry host=Dns.GetHostEntry(ip.ToString());

hostname=host.HostName;

}catch(Exception ex)

{

Console.WriteLine(ex.ToString());

}returnhostname;

}

(3)、获取MAC地址

[DllImport("ws2_32.dll")]private static extern int inet_addr(stringcp);

[DllImport("IPHLPAPI.dll")]private static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 pMacAddr, refInt32 PhyAddrLen);private string GetMacAddress(string hostip)//获取远程IP(不能跨网段)的MAC地址

{string Mac = "";try{

Int32 ldest= inet_addr(hostip); //将IP地址从 点数格式转换成无符号长整型

Int64 macinfo = newInt64();

Int32 len= 6;

SendARP(ldest,0, ref macinfo, reflen);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;

}returnMac;

}

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

Thread waitT = new Thread(newThreadStart(ipwait));

waitT.Start();//等待所有线程执行完毕在写入textbox中

public voidipwait()

{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 <= endIp && isrun == true; q++)

{//---------------------ping

ipaddr = ip +q;

lvi= newListViewItem();

Ping ping= newPing();

PingReply reply=ping.Send(IPAddress.Parse(ipaddr), overTime);if (reply.Status ==IPStatus.Success)

{

ResuleTextBox.Text+= ipaddr + "Ping时间" + reply.RoundtripTime + "毫秒\n";

mac=GetMacAddress(ipaddr);//IPHostEntry host = Dns.GetHostEntry(ipaddr);//IPHostEntry host = Dns.GetHostByAddress(ipaddr);//ResuleTextBox.Text += "主机名为 " + host.HostName + "\n";//ScanResultlistBox.Items.Add(ipaddr + " " + mac + " 在线 ");

lvi.BackColor =Color.LightSeaGreen;

lvi.Text=ipaddr;

Task t1 = new Task(GetHostEntry,ipaddr);

t1.Start();

t1.Wait(timeout);//设置获取主机名超时时间

if(t1.IsCompleted)

{

lvi.SubItems.Add(t1.Result);

}else{

lvi.SubItems.Add("-");

}

lvi.SubItems.Add(mac);

lvi.SubItems.Add("在线");

}else{

lvi.BackColor=Color.Pink;

lvi.Text=ipaddr;

lvi.SubItems.Add("-");

lvi.SubItems.Add("-");

lvi.SubItems.Add("不在线");

}

progressBar.Value=q;

progressBar.Update();

ListViewUpdate(lvi);

ResuleTextBox.SelectionStart= ResuleTextBox.Text.Length -1;

ResuleTextBox.ScrollToCaret();

}

ScanResultlistBox.Items[ScanResultlistBox.Items.Count- 1].EnsureVisible();

}catch(Exception ex)

{

Console.WriteLine(ex.ToString());

isrun= false;

progressBar.Value=progressBar.Minimum;

startScanbutton.Enabled= true;

stopScanbutton.Enabled= false;

ResuleTextBox.Text+=ex.ToString();

}

startScanbutton.Enabled= true;

stopScanbutton.Enabled= false;

isrun= false;

progressBar.Value=progressBar.Maximum;

}

说明一下:在我获取主机名的过程中,发现如果不对获取主机名设置一个超时时间,那么将会出现一个问题,程序将会卡在获取主机名的这个阶段,无法向下继续执行,因为,为了高效的执行,给获取主机名设置一个超时时间,将会大大提高程序的执行效率。

二、主要端口状态获取方法

Thread waitT = new Thread(newThreadStart(portwait));

waitT.Start();//等待所有线程执行完毕在写入textbox中

public voidportwait()

{int startIp = Int32.Parse(IPStarttextBox.Text.Split('.')[3]);int endIp = Int32.Parse(IPStoptextBox.Text.Split('.')[3]);string ip = IPStarttextBox.Text.Split('.')[0] + "." + IPStarttextBox.Text.Split('.')[1] + "." + IPStarttextBox.Text.Split('.')[2] + ".";

String mac= "" , ipaddr ="";

ListViewItem lvi;

String host;int timeout = int.Parse(TimeOuttextBox.Text);for (int q = startIp; q <= endIp && isrun == true; q++)

{

ResuleTextBox.Text+= (ip + q) + "IP地址扫描中---\n";//---------------------ping

Ping ping = newPing();

PingReply reply= ping.Send(IPAddress.Parse(ip +q), overTime);

ipaddr= ip +q;if (reply.Status ==IPStatus.Success)

{

ResuleTextBox.Text+=ipaddr + "Ping时间" + reply.RoundtripTime + "毫秒\n";

mac=GetMacAddress(ipaddr);

Task t1 = new Task(GetHostEntry, ipaddr);

t1.Start();

t1.Wait(timeout);if(t1.IsCompleted)

{

host=t1.Result.ToString();

}else{

host= "-";

}

ResuleTextBox.Text+= "MAC地址为" + mac + "\n";

}else{//ScanResultlistBox.Items.Add(ipaddr + " " + "-" + " " + "-" + " " + " - 不可达\n");

lvi = newListViewItem();

lvi.BackColor=Color.Pink;

lvi.Text=ipaddr;

lvi.SubItems.Add("-");

lvi.SubItems.Add("-");

lvi.SubItems.Add("不可达");

ResuleTextBox.Text+= ipaddr + "不可达\n";

ListViewUpdate(lvi);continue;

}//---------------------end

Thread[] tharr;if (numThread < (portEnd - portStart + 1))

{

tharr= new Thread[portEnd - portStart + 1];

}else{

tharr= newThread[numThread];

}

str= new List();for (int i = portStart; (i <= portEnd) && (isrun ==true); i++)

{

Thread thread= new Thread(newParameterizedThreadStart(Scan));

thread.Start(new IPEndPoint(IPAddress.Parse(ip + q), i));//每扫描一个端口创建一个线程

ResuleTextBox.Text+= i + "端口扫描中---\n";

tharr[i- portStart] =thread;

progressBar.Value=i;string s =State(i);

lvi= newListViewItem();if (s == "Open")

{

lvi.BackColor=Color.LightSeaGreen;

}else{

lvi.BackColor=Color.Silver;

}

lvi.Text= ipaddr + ":" +i.ToString();

lvi.SubItems.Add(host);

lvi.SubItems.Add(mac);if(checkBox1.Checked)

{if (s == "Open")

{//ScanResultlistBox.Items.Add(ip + q + " " + mac +" "+ i + " " + s + " " + " " + Service(i));

lvi.SubItems.Add(i.ToString());

lvi.SubItems.Add(s);

lvi.SubItems.Add(Service(i));

}else{

lvi= null;

}

}else{if (s == "Open")

{//ScanResultlistBox.Items.Add(ip + q + " " + mac + " " + i + " " + s + " " + " " + Service(i));

lvi.SubItems.Add(i.ToString());

lvi.SubItems.Add(s);

lvi.SubItems.Add(Service(i));

}else{//ScanResultlistBox.Items.Add(ip + q + " " + mac + " " + i + " " + s + " " + " ");

lvi.SubItems.Add(i.ToString());

lvi.SubItems.Add(s);

lvi.SubItems.Add("");

}

}if (lvi != null)

{

ListViewUpdate(lvi);

}

}bool iscon = true;//第一个线程等待时间

for (int i = 0; i < tharr.Length; i++)

{if (tharr[i] == null)continue;while (tharr[i].IsAlive && iscon)//端口超时设置时间(目前200毫秒),一直等待此ip所有线程执行完毕才扫描下个ip

{

Thread.Sleep(200);

iscon= false;//第一个线程给200ms等待时间,其他线程由于同步执行的,所以没等待时间了,如果线程还没执行完,说明此端口不可达。

}

}

str.Sort();

ResuleTextBox.Text+= "开放端口:";for (int k = 0; k < str.Count; k++)

ResuleTextBox.Text+= str[k] + " ";

ResuleTextBox.Text+= "\n";

}

ScanResultlistBox.Items[ScanResultlistBox.Items.Count- 1].EnsureVisible();if (isrun == true)

{

MessageBox.Show("扫描完成");

progressBar.Value=progressBar.Minimum;

startScanbutton.Enabled= true;

stopScanbutton.Enabled= false;

isrun= false;

}else{

MessageBox.Show("扫描终止");

startScanbutton.Enabled= true;

stopScanbutton.Enabled= false;

progressBar.Value=progressBar.Minimum;

isrun= false;

}

}public string State(inti)

{

str.Sort();for (int k = 0; k < str.Count; k++)

{string s =str[k];if (Convert.ToString(i) ==s)return "Open";

}return "Closed";

}public string Service(inti)

{switch(i)

{case 80:return "HTTP协议代理服务";case 135:return "DCE endpoint resolutionnetbios-ns";case 445:return "安全服务";case 1025:return "NetSpy.698(YAI)";case 8080:return "HTTP协议代理服务";case 8081:return "HTTP协议代理服务";case 3128:return "HTTP协议代理服务";case 9080:return "HTTP协议代理服务";case 1080:return "SOCKS代理协议服务";case 21:return "FTP(文件传输)协议代理服务";case 23:return "Telnet(远程登录)协议代理服务";case 443:return "HTTPS协议代理服务";case 69:return "TFTP协议代理服务";case 22:return "SSH、SCP、端口重定向协议代理服务";case 25:return "SMTP协议代理服务";case 110:return "POP3协议代理服务";default:return "Unknow Servies";

}

}public void Scan(objectPoint)

{

IPEndPoint IPPoint=(IPEndPoint)Point;try{

TcpClient tcp= newTcpClient();

tcp.Connect(IPPoint);if(tcp.Connected)

str.Add(Convert.ToString(IPPoint.Port));

}catch(Exception ex)

{

Console.WriteLine(ex.ToString());

}

}

好了,大家最后,可能都会说,我不想设计,也不想开发,我想要现成的怎么办?当然了,最后附上程序,大家可以实际进行测试使用。

工具链接:http://download.csdn.net/detail/dwx1005526886/9808540

python扫描局域网端口和ip_如何高效实现扫描局域网IP、主机名、MAC和端口相关推荐

  1. java扫描局域网中可用ip_使用java线程扫描局域网ip简单方案

    package com.cjh.thread; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...

  2. 端口、木马、安全和扫描,四大应用知识详解(转)

    看到这个题目你也许有些奇怪,怎么把这几个词放在了一起,其实谈起端口和木马都是老生常谈了,但即使是常谈还有很多人的计算机被"冲击波"冲过之后又被"震荡波"狠狠地震 ...

  3. python扫描局域网端口和ip_我想用python扫描局域网内的ip和mac地址,需要什么第三方库...

    匿名用户 1级 2016-08-12 回答 MAC地址也叫物理地址.硬件地址或链路地址,由网络设备制造商生产时写在硬件内部.IP地址与MAC地址在计算机里都是以二进制表示的,IP地址是32位的,而MA ...

  4. Python # 扫描端口功能 # 获取网卡的Mac地址 # 局域网扫描器IP地址和MAC地址,获取网卡名称和其ip地址

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 开发人员: # time: 2021-09-07 20:37 # 开发工具: PyCharm # Ver ...

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

    近几年工作经常使用RFID识读器,智能家居网关,温湿度传感器.串口服务器.视频编码器等,一般是有串口和网口,由于现场原因一般较少使用串口,大多使用网口.连接方法是IP地址和端口,有的设备带搜索软件,有 ...

  6. python爆破端口_挑战全网多线程批量扫描爆破弱办事端口工具,Python制造专属!...

    挑战全网多线程批量扫描&爆破弱办事端口工具,Python制造专属!-1.jpg (29.47 KB, 下载次数: 0) 2018-8-16 17:05 上传 前言 你学习Python的目的是什 ...

  7. nmap扫描ipv6端口_web渗透测试系列 之 扫描(3)

    Nmap-扫描器之王 今天我们来聊聊被称之为扫描器之王的nmap,一般我们在渗透的时候都会这样说,第一步nmap开路.Nmap是一款网络扫描和主机检测的工具.开源免费的.可用于:主机发现.端口发现或枚 ...

  8. python 病毒脚本_python实现集中式的病毒扫描功能详解

    本文实例讲述了python实现集中式的病毒扫描功能.分享给大家供大家参考,具体如下: 一 点睛 本次实践实现了一个集中式的病毒扫描管理,可以针对不同业务环境定制扫描策略,比如扫描对象.描述模式.扫描路 ...

  9. Python五子棋小游戏源代码,支持人机对战和局域网对战两模式

    Python五子棋小游戏源代码,支持人机对战和局域网对战两模式,程序运行截图: 核心程序代码 WuZi.py ''' Function:五子棋小游戏-支持人机和局域网对战 Author:Charles ...

  10. 组建一个局域网一般会用到哪些设备_朋友私信一个简单的问题:端口和网关到底有什么区别?...

    网关(Gateway):是网络的出口和入口,网关定义网络的边界. 由于路由器集成了网关的功能,所以我们一般所说的网关,大多数指路由器. 端口(Port)有两种解释:一种是指物理端口,是指计算机.路由器 ...

最新文章

  1. python3语法糖------装饰器
  2. Metasploit远程调用Nessus出错
  3. MariaDB 数据库迁移
  4. 研究表明:安卓和iOS应用无节操滥用邮箱和定位数据
  5. Maven——Maven概述
  6. linux下查看机器配置
  7. django内置服务器
  8. 调整和改编赛车游戏——游戏屏幕
  9. Java 面向对象语言基础
  10. RxJS异步编程的简介
  11. igbt原理动画演示视频_IGBT的结构与工作原理 测量方法详细讲解
  12. 从社交网络图的edgelist得到adj
  13. 浙江中医药大学第十二届大学生程序设计竞赛 Wpremig的AH之战
  14. 航程门业:木门企业可搭上移动客户端班车 获得客户
  15. 安卓App旅游(含汽车订票,含酒店预定,含团购)源码
  16. 天津市雏鹰企业认定奖励及申报标准介绍,补贴5万
  17. 鞋长度和欧美的标准宽度换算表
  18. SRS十周年杭州站沙龙技术备忘录
  19. 孟母三迁:学习中环境对人的影响特别的重要
  20. 示波器表笔旁边的夹子是什么_示波器探头容易忽略的几个问题

热门文章

  1. 【Python】TX云服务器下CentOS+Python3+Nginx+uwsgi+Bottle搭建Web服务
  2. 笔记本电脑进入BIOS设置快捷键大全
  3. 海定计算机计算标准差,方差 标准差
  4. linux usb摄像头设备,Linux系统下USB摄像头驱动开发
  5. Element 中表格表头添加搜索图标和功能使用
  6. 谈一谈|《黑神话:悟空》实机演示观后感
  7. cmos与非门电路、或非门电路
  8. html合并边框线,css中border-collapse属性设置表格边框线的方法
  9. Golang 1.16 新特性-embed 包及其使用
  10. [6.15] 心态 信念