ping工具的实现

应课程设计的需要,需要完成以下内容,实现ping工具的使用

任务要求:

  1. 使用该工具可以测试目标主机的状态
    根据ICMP回显请求和回显应答报文,使用该工具测试目标主机的状态。
  2. 程序应该提供帮助信息
    为了方便用户使用,该工具应该提供帮助信息,当用户需要帮助时可以进行查询。

经过为期两周的课程设计,通过从材料收集到最终完成,我从中学习到了很多,在这里进行了简单的分享
下面是核心代码:其基本实现了ping的操作,根据提示输入需要ping的主机或者域名就好

核心代码参考链接:https://blog.csdn.net/zhj082/article/details/80531628
这里非常感谢原作者
在此基础上简单的加上了ping的统计信息,更加的契合cmd下的返回信息

核心代码

# encoding:utf-8
import time
import struct
import socket
import select
import sysdef chesksum(data):n=len(data)m=n % 2sum=0for i in range(0, n - m ,2):sum += (data[i]) + ((data[i+1]) << 8)#传入data以每两个字节(十六进制)通过ord转十进制,第一字节在低位,第二个字节在高位if m:sum += (data[-1])#将高于16位与低16位相加sum = (sum >> 16) + (sum & 0xffff)sum += (sum >> 16) #如果还有高于16位,将继续与低16位相加answer = ~sum & 0xffff#  主机字节序转网络字节序列(参考小端序转大端序)answer = answer >> 8 | (answer << 8 & 0xff00)return answerdef request_ping(data_type,data_code,data_checksum,data_ID,data_Sequence,payload_body):#  把字节打包成二进制数据imcp_packet = struct.pack('>BBHHH32s',data_type,data_code,data_checksum,data_ID,data_Sequence,payload_body)icmp_chesksum = chesksum(imcp_packet)  #获取校验和#  把校验和传入,再次打包imcp_packet = struct.pack('>BBHHH32s',data_type,data_code,icmp_chesksum,data_ID,data_Sequence,payload_body)return imcp_packetdef raw_socket(dst_addr,imcp_packet):'''连接套接字,并将数据发送到套接字'''#实例化一个socket对象,ipv4,原套接字,分配协议端口rawsocket = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.getprotobyname("icmp"))#记录当前请求时间send_request_ping_time = time.time()#发送数据到网络rawsocket.sendto(imcp_packet,(dst_addr,80))#返回数据return send_request_ping_time,rawsocket,dst_addrdef reply_ping(send_request_ping_time,rawsocket,data_Sequence,timeout = 2):while True:#开始时间started_select = time.time()#实例化select对象,可读rawsocket,可写为空,可执行为空,超时时间what_ready = select.select([rawsocket], [], [], timeout)#等待时间wait_for_time = (time.time() - started_select)#没有返回可读的内容,判断超时if what_ready[0] == []:  # Timeoutreturn -1#记录接收时间time_received = time.time()#设置接收的包的字节为1024received_packet, addr = rawsocket.recvfrom(1024)#获取接收包的icmp头#print(icmpHeader)icmpHeader = received_packet[20:28]#反转编码type, code, checksum, packet_id, sequence = struct.unpack(">BBHHH", icmpHeader)if type == 0 and sequence == data_Sequence:return time_received - send_request_ping_time#数据包的超时时间判断timeout = timeout - wait_for_timeif timeout <= 0:return -1
def dealtime(dst_addr,sumtime,shorttime,longtime,accept,i,time):sumtime+=timeprint(sumtime)if i==4:print("{0}的Ping统计信息:".format(dst_addr))print("数据包:已发送={0},接收={1},丢失={2}({3}%丢失),\n往返行程的估计时间(以毫秒为单位):\n\t最短={4}ms,最长={5}ms,平均={6}ms".format(i+1,accept,i+1-accept,(i+1-accept)/(i+1)*100,shorttime,longtime,sumtime))
def ping(host):send, accept, lost = 0, 0, 0sumtime, shorttime, longtime, avgtime = 0, 1000, 0, 0#TODO icmp数据包的构建data_type = 8 # ICMP Echo Requestdata_code = 0 # must be zerodata_checksum = 0 # "...with value 0 substituted for this field..."data_ID = 0 #Identifierdata_Sequence = 1 #Sequence numberpayload_body = b'abcdefghijklmnopqrstuvwabcdefghi' #data# 将主机名转ipv4地址格式,返回以ipv4地址格式的字符串,如果主机名称是ipv4地址,则它将保持不变dst_addr = socket.gethostbyname(host)print("正在 Ping {0} [{1}] 具有 32 字节的数据:".format(host,dst_addr))for i in range(0,4):send=i+1#请求ping数据包的二进制转换icmp_packet = request_ping(data_type,data_code,data_checksum,data_ID,data_Sequence + i,payload_body)#连接套接字,并将数据发送到套接字send_request_ping_time,rawsocket,addr = raw_socket(dst_addr,icmp_packet)#数据包传输时间times = reply_ping(send_request_ping_time,rawsocket,data_Sequence + i)if times > 0:print("来自 {0} 的回复: 字节=32 时间={1}ms".format(addr,int(times*1000)))accept+=1return_time=int(times * 1000)sumtime += return_timeif return_time > longtime:longtime = return_timeif return_time < shorttime:shorttime = return_timetime.sleep(0.7)else:lost+=1print("请求超时。")if send == 4:print("{0}的Ping统计信息:".format(dst_addr))print("\t数据包:已发送={0},接收={1},丢失={2}({3}%丢失),\n往返行程的估计时间(以毫秒为单位):\n\t最短={4}ms,最长={5}ms,平均={6}ms".format(i + 1, accept, i + 1 - accept, (i + 1 - accept) / (i + 1) * 100, shorttime, longtime, sumtime/send))if __name__ == "__main__":# if len(sys.argv) < 2:#     sys.exit('Usage: ping.py <host>')# ping(sys.argv[1])i=input("请输入要ping的主机或域名\n")ping(i)# host='www.baidu.com'# ping(host)

运行截图如下

代码思路解析:

首先,获取ping的主机host值,传入到主函数进行下一步的操作,跟据ICMP报文格式,进行ICMP报文的本地构建,通过dns解析获取域名的ip地址,之后本地构建的ICMP报文进行按照格式进行打包,实现计算机可以识别的二进制数据流,封装好的ICMP报文进行校验和计算,把校验和带入,在次封装打包,实例化rocket对象,把封装后的ICMP报文发送给目标主机,对返回的信息进行解包与处理,最后汇总输出


图形化处理

只是这样完成了,可是用户体验很不好,最好就是图形化界面的实现,对用户隐藏后台操作,因为,用户爸爸是不关心怎么运行的,只关心结果。那么接下来就是图形化界面的实现
这里需要用到PyQt5的模块,如果没有安装去安装一下

Qt Designer的安装与汉化教程
https://blog.csdn.net/jia666666/article/details/81710839
pycharm中PyQt5的配置
https://blog.csdn.net/jia666666/article/details/81783410
PyQt5快速开发与实战-学习笔记
https://blog.csdn.net/jia666666/column/info/26409

环境配置的话,只需要看前两个就好了,第三个链接是深入学习PyQt5的,可以不看

先用py designer设计一个简洁的图形化界面,如下图
之后用pyuic进行ui转py的操作
如有不懂参考上面第二个链接
最后实现后台信号与槽函数之间的调用

这里在菜单栏里也写入了帮助信息,如下

到此,这个课程设计就算完成了。

下面是参考的一些资料

python实现一个简单的ping工具
https://blog.csdn.net/zhj082/article/details/80531628
官方模块解析
https://docs.python.org/3/library/socket.html
https://docs.python.org/3/library/select.html#select.select
https://docs.python.org/3/library/struct.html
https://docs.python.org/3/library/sys.html
如何计算icmp校验和
https://blog.csdn.net/zhj082/article/details/80518322
sys模块详解
https://blog.csdn.net/Alawaka2018/article/details/80784893
socked模块
https://www.cnblogs.com/God-Li/p/7625825.html
https://blog.csdn.net/rebelqsp/article/details/22109925

源文件下载

https://download.csdn.net/download/jia666666/10876415

python实现ping工具相关推荐

  1. python实现一个简单的ping工具

    继上一篇计算checksum校验和,本章通过socket套接字,struct字节打包成二进制,select返回套接字的文件描述符的结合,实现一个简单的ping工具. #!/usr/bin/python ...

  2. ping 工具开发日记(1)

    ping 工具开发日记(1) 2021.1.15 hyp 0.准备 开发语言:python 3.8 开发环境:windows 7 开发工具:pycharm 应用功能:1.能实现不同系统(windows ...

  3. Python 如何 ping

    背景 最近需要监测一个服务器的运行状态. 因为服务器部署在两地,网络抖动对业务的影响很大,所以要在网络抖动情况严重时做一些警报. 实现方法有很多种,最终选择了使用 Python 来实现这样的功能. 实 ...

  4. 【绿冰壶的脚本小屋】第二期:基于icmp协议开发简易ping工具

    [绿冰壶的脚本小屋]第二期:基于ICMP协议开发简易ping工具 任务目标:编写程序使用 ICMP 协议探测主机是否存活 任务要求: 1.理解ICMP协议的原理 2.实现代码,尽可能多的实现探测主机是 ...

  5. Python包管理工具Distribute的安装

    Python包管理工具Distribute的安装 Python的包管理工具常见的有easy_install, setuptools, 还有pip, distribute,那麽这几个工具有什么关系呢,看 ...

  6. 这些Python常用的工具和学习资源你都知道么?

    经常收到读者的疑问,公众号的代码排版真的很好看,究竟用的什么开发工具呢?在这里,统一回复一下大家,公众号的排版用的是 MarkDown Here,而我平时使用的Python开发工具是Pycharm.这 ...

  7. python学习一(python与pip工具下载与安装)

    python学习一(python与pip工具下载与安装)  一 Python下载  二 安装Python  三 安装 pip   3.1 采用cd命令进入到Scripts 目录下面   3.2 输入命 ...

  8. python机器学习可视化工具Yellowbrick介绍及平行坐标图实战示例

    python机器学习可视化工具Yellowbrick介绍及平行坐标图实战示例 目录 python机器学习可视化工具Yellowbrick介绍及平行坐标图实战示例 yellowbrick简介及安装

  9. python机器学习可视化工具Yellowbrick绘图获取最佳聚类K值实战示例

    python机器学习可视化工具Yellowbrick绘图获取最佳聚类K值实战示例 目录 机器学习可视化工具Yellowbrick绘图获取最佳聚类K值实战示例

最新文章

  1. 《元学习meta learning)》2020综述论文大全!
  2. 为什么要强制弃坑Fastjson而主推Jackson?
  3. java 反转 控制 注入_控制反转和依赖注入
  4. [tarjan][树形dp] 洛谷 P2515 软件安装
  5. 35岁的互联网人出路在哪?
  6. 通过延迟加载和代码拆分提高网站性能
  7. theano 深度学习大全
  8. python教学ppt百度云_python教程ppt百度云盘-Python教程ppt课件类型的
  9. 从10万到百亿营收的背后 | 同程旅游CTO V课堂实录
  10. 数据结构之一元多项式相加
  11. Vue2.0 —— 运用算法实现 AST 抽象语法树
  12. 互联网运营面试题_产品运营面试常见问题
  13. Springboot:整合DubboProvider的配置以及Comsumer的配置
  14. 你要偷偷学Python,然后惊艳所有人(类的属性和方法)
  15. Linux系统存储之LVM
  16. 机器学习——数据的共线性问题(岭回归、LASSO回归、逐步回归、主成分回归)
  17. PS存储为和导出为的区别
  18. 下载chrome的.crx文件
  19. 可重入锁_什么是可重入锁?
  20. 手机突然间不能上网了,无线数据网络正常?

热门文章

  1. 课堂笔记_ 光线跟踪原理
  2. 年度热点!药物设计必看!CADD计算机辅助药物设计 AIDD人工智能药物发现
  3. 推荐一个不错的学术资源论坛
  4. 密码学之数字信封 Digital_Envelope
  5. realplayer java,在网页中使用realplayer播放rm文件
  6. 远古VOD系统相关操作
  7. java PKCS12 证书生成
  8. U盘启动盘怎么制作?
  9. 艾永亮:如果互联网是蚂蚁,产品是大象,那超级产品将开启企业新时代
  10. Android多级列表的实现