来源:https://www.cnblogs.com/donlin-zhang/p/6812675.html

在测试环境搭建的过程中,经常需要给服务器分配静态IP地址,由于不清楚当前局域网内部哪些IP地址是空闲的,所以经常需要一个一个的去试,才能找到一个可用的IP。在之前的一家公司工作的时候,用到过一个检测IP使用情况的工具,但是属于内部工具,无法获取到。于是乎便想,何不自己开发一个呢?

  说做便做,开发环境使用的是Python3.6+PyQt5. 如果你的环境不一样,可能会运行失败。

  源码地址:https://github.com/LuckyDL/easyPing--python3.6

  1、界面设计

  界面用QtDesigner来画的,先来一张原型图如下,每次只能测试一个网段的IP占用情况,0-255个小窗格用来显示IP地址的使用情况,默认为灰色,程序执行后,IP地址已使用的显示绿色,IP地址未被使用的显示红色。

  

  做界面的时候,255个小窗格画起来实在是要人命,于是就仅画出了窗口框架,将UI文件转成Python源码后,自己手动编写代码来实现255窗格布局。代码片段如下:

     self.gridlayout = QtWidgets.QGridLayout(self.widget1)
self.gridlayout.setContentsMargins(0, 0, 0, 0)
self.gridlayout.setObjectName("gridlayout")
self.gridlayout.setSpacing(7) self.label_list = []
list_index = 0
for i in range(1, 17):
for j in range(1, 17):
label = QtWidgets.QLabel(self.widget1)
label.setMinimumSize(QtCore.QSize(32, 15))
label.setStyleSheet("")
label.setAlignment(QtCore.Qt.AlignCenter)
label.setText(QtCore.QCoreApplication.translate("MyPing", str(list_index)))
self.label_list.append(label)
self.gridlayout.addWidget(label, i-1, j-1, 1, 1)
list_index += 1

  2、ping功能实现

  ping的实现方法有多种,最常用的当然是通过调用系统自带的ping功能来实现。

  Python来执行系统命令的方式有os.system(), os.popen(), subprocess等方法,在Python3.6的手册中表明,subprocess模块是用来替代os.system等函数的。因此我们也使用subprocess模块来调用ping

  python3.5中,subprocess增加了一个run函数,run函数创建有一个子进程来运行需要执行的命令,返回一个CompletedProcess实例,该函数基本上可以处理所有的应用场景,run是对subprocess.Popen的一层封装。

python3.5以下可以使用subprocess.call(), subprocess.check_call()等函数来实现相同的功能,具体可查阅Python手册

def get_ping_result(self, ip):
'''
检查对应的IP是否被占用
'''
cmd_str = "ping {0} -n 1 -w 600".format(ip)
DETACHED_PROCESS = 0x00000008 # 不创建cmd窗口
try:
subprocess.run(cmd_str, creationflags=DETACHED_PROCESS, check=True) # 仅用于windows系统
except subprocess.CalledProcessError as err:
self._ping_signal.emit(False, ip)
else:
self._ping_signal.emit(True, ip)

说明:

  在默认情况下,使用subprocess.run()执行ping命令的时候,会弹出一个cmd窗口,当256个线程一起运行的时候,满屏的窗口,想想都很酸爽。。。

在windows系统下,可以传入creationflags参数来使subprocess创建的子进程不生成console

  参考链接:https://stackoverflow.com/questions/7006238/how-do-i-hide-the-console-when-i-use-os-system-or-subprocess-call

  check参数为True时,函数将检测执行结果是否为0(此处0表示执行成功),非零则抛出异常。

    3、多线程

在使用pyqt进行GUI编程的时候,如果涉及到需要长时间后台运行的操作,一般需要使用多线程的方式,否则界面会阻塞,直到后台运行结束,造成程序卡死的假象。

在本程序实现,要实现256个地址的ping操作,如果单线程操作,肯定半天也无法得到结果,因此我们为每一个IP地址分配一个线程,最多256线程并发运行,1~2秒的时间即可得到整个网段的IP地址占用情况

多线程实现核心代码如下:

def start_ping(self):
'''
启动多线程
'''
self.reset_ui()
startip = self.ui.startIP.text().split('.')
endip = self.ui.endIP.text().split('.')
tmp_ip = startip pthread_list = []
for i in range(int(startip[3]), int(endip[3]) + 1):
tmp_ip[3] = str(i)
ip = '.'.join(tmp_ip)
pthread_list.append(threading.Thread(target=self.get_ping_result, args=(ip,)))
for item in pthread_list:
item.setDaemon(True)
item.start()

子线程通过发射信号的方式来通知主程序执行结果,最终主程序根据运行结果渲染界面。

全部源码可到GitHub下载,链接见文章头部。

使用Python检测局域网内IP地址使用情况的更多相关文章

  1. 指定端口号,多线程扫描局域网内IP地址

    小白第一次发博客,请各路大神不要喷,有错的地方还请不吝啬指教,谢谢....... 因为注释基本上已经说清楚啦,在这里就不多说什么啦,知识不够怕误人子弟 # -*- coding:utf-8 -*-im ...

  2. 局域网内ping [局域网内ip地址]命令详解

    一.工作过程 主机A向主机B发送一个ICMP请求报文[类型字段为8,代码字段为0],若收到ICMP回复报 文[类型字段为0,代码字段为0]则说明主机B处于活动状态:若超时未收到回复,则可能是 因为(1 ...

  3. 用Python在局域网根据IP地址查找计算机名

    1.要使用socket模块 代码如下: import sys, socket # hostname = socket.gethostname()# print("Host name:&quo ...

  4. 在windows命令行批量ping局域网内IP

    参考了博客园Alfred Zhao的文章<Windows平台ping测试局域网所有在用IP> 在cmd命令行运行如下命令即可: ,,) -w .%i | find "回复&quo ...

  5. Python之实用的IP地址处理模块IPy

    实用的IP地址处理模块IPy 在IP地址规划中,涉及到计算大量的IP地址,包括网段.网络掩码.广播地址.子网数.IP类型等 别担心,Ipy模块拯救你.Ipy模块可以很好的辅助我们高效的完成IP的规划工 ...

  6. Python自动化运维——IP地址处理模块

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:IPy 功能:辅助我们高效的完成IP的规划工作 安装: wget https://pypi.python.o ...

  7. Python - 获取本机IP地址、Mac地址

    Python - 获取本机IP地址.Mac地址 在python中获取ip地址和在php中有很大不同,在php中往往比较简单.那再python中怎么做呢? 直接看代码: # Python - 获取本机I ...

  8. python 判断两个ip地址是否属于同一子网

    python 判断两个ip地址是否属于同一子网 """ 判断两个IP是否属于同一子网, 需要判断网络地址是否相同 网络地址:IP地址的二进制与子网掩码的二进制地址逻辑&q ...

  9. linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)

    本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...

随机推荐

  1. 【笔记】《Redis设计与实现》chapter15 复制

    15.1 旧版复制功能的实现 同步 命令传播 旧版复制功能的缺陷 15.3 新版复制功能的实现 Redis2.8开始,使用PSYNC命令替代SYNC命令来执行复制时的同步操作 PSYNC命令具有完整重 ...

  2. mybatis的本质和原理

    背景 项目需要,我们需要自己做一套mybatis,或者使用大部分mybatis的原始内容.对其改造,以适应需要.这就要求我再次学习一下mybatis,对它有更深入的了解. 是什么    MyBatis ...

  3. vuex 引用方法

    引入Vuex(前提是已经用Vue脚手架工具构建好项目) 1.利用npm包管理工具,进行安装 vuex.在控制命令行中输入下边的命令就可以了. npm install vuex --save 要注意的是 ...

  4. Mysql Char 和 Varchar的区别

    CHAR和VARCHAR都是字符串类型,它们的具体区别为: 长度大小区别: CHAR(M)定义的列的长度为固定的,M取值可以为0-255之间: VARCHAR(M)定义的列的长度为可变长,M取值可以为 ...

  5. 文档翻译第002篇:Process Monitor帮助文档(Part 2)

    [筛选与高亮显示] Process Monitor提供了一些方式来配置筛选器和高亮显示.         筛选器的包含与排除 您可以在筛选器中指定事件的属性,这样就可以令Process Monitor ...

  6. Django中的表单

    目录 表单 Django中的表单 用表单验证数据 自定义验证 表单 HTML中的表单是用来提交数据给服务器的,不管后台服务器用的是 Django  还是 PHP还是JSP还是其他语言.只要把 inpu ...

  7. <JVM中篇:字节码与类的加载篇>02-字节码指令集

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  8. Mybatis-Plus01 快速开始

    Mybatis-Plus虽然官网上有一个快速开始,但是实际操作有点问题,所以,自己写了一个. 版本说明 如果用其他软件版本可能会有部分差异 mybatis-plus:3.4.0 之前我是使用的是3.0 ...

  9. 月薪6K和月薪2W的测试,有什么区别?

    之前,我收到了一位朋友的好消息,说自己拿到了接近月薪 20k 的 offer.   说实话,软件测试岗位前期门槛低,但是想要拿到高薪真没那么简单.工作 2-3 年薪资还在原地打转的同学,都大有人在. ...

  10. 软件测试中的测试用例Test Case原来是这么回事!

    如果你去找一份功能测试的工作,在软件测试工程师面试过程中,有一些面试官会来一两个非常简单的问题 什么是Test Case?你是如何去写Test Case的? 我们先来看一下测试用例的介绍 什么是测试用 ...