来源: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. 使用gradle插件发布项目到nexus中央仓库

    目录 简介 Gradle Nexus Publish Plugin历史 插件的使用 Groovy DSL Kotlin DSL 插件背后的故事 总结 简介 Sonatype 提供了一个叫做开源软件资源 ...

  2. 【笔记】《Redis设计与实现》chapter19 事务

    chapter19 事务 Redis通过MULTI.EXEC.WATCH等命令来实现事务功能 19.1 事务的实现 事务开始 redis> MULTI ok 通过切换客户端状态的flag属性的R ...

  3. 小程序使用 Promise.all 完成文件异步上传

    小程序使用 Promise.all 完成文件异步上传 extends [微信小程序开发技巧总结(二) -- 文件的选取.移动.上传和下载 - Kindear - 博客园 (cnblogs.com)] ...

  4. JDK8新特性(一) Lambda表达式及相关特性

    函数式接口 函数式接口是1.8中的新特性,他不属于新语法,更像是一种规范 面向对象接口复习 在这里先回顾一下面向对象的接口,创建接口的关键字为interface,这里创建一个日志接口: public ...

  5. lumen Rest API 起步

    lumen Rest API 起步 修改项目文件 .env DB_DATABASE=<数据库名> DB_USERNAME=<数据库用户名> DB_PASSWORD=<数据 ...

  6. Nginx 配置浏览Linux 系统目录并下载文件

    准备工作: 安装编译工具及库文件: yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel 安装PCRE( ...

  7. (转载)springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)

    转载自https://www.jianshu.com/p/dca01aad6bc8 一.先扔一张图   image.png 说明: 本文涵盖了关于RabbitMQ很多方面的知识点, 如: 消息发送确认 ...

  8. 【小白向】基于Docker使用Gogs,Drone以及drone-runner-docker的自动化部署

    Gogs是基于Go语言编写的可以替代gitlab的代码托管平台,它没有gitlab那么庞大且不需要占用大量资源,对小型服务器相对于比较友好,我们甚至可以使用树莓派搭建. 服务器配置: * 操作系统:C ...

  9. C/C++ 导入表与IAT内存修正

    本章教程中,使用的工具是上次制作的PE结构解析器,如果还不会使用请先看前一篇文章中对该工具的介绍,本章节内容主要复习导入表结构的基础知识点,并通过前面编写的一些小案例,实现对内存的转储与导入表的脱壳修 ...

  10. 深入浅出带你玩转sqlilabs(五)-布尔/延时盲注与二次注入

    SQL测试-基于布尔,延时盲注 布尔,延时注入常用到的判断语句 regexp regexp '^xiaodi[a-z]' 匹配xiaodi及xiaodi...等 if if(条件,5,0) 条件成立 ...