python 实现ping测试延迟的两种方法


Posted in Python onDecember 10, 2020

一.python实现ping返回延迟繁琐版

#!/usr/bin/python3.7
# !coding:utf-8
__author__ = 'hsz'
__date__ = 'Thu Feb 27 22:41:15 EST 2020'

import time
import struct
import socket
import select
import sys


def chesksum(data):
  """
  校验
  """
  n = len(data)
  m = n % 2
  sum = 0
  for 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 answer

  '''
  连接套接字,并将数据发送到套接字
  '''


def raw_socket(dst_addr, imcp_packet):
  rawsocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
  send_request_ping_time = time.time()
  # send data to the socket
  rawsocket.sendto(imcp_packet, (dst_addr, 80))
  return send_request_ping_time, rawsocket, dst_addr

  '''
  request ping
  '''


def 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_packet
  '''
  reply ping
  '''


def reply_ping(send_request_ping_time, rawsocket, data_Sequence, timeout=2):
  while True:
    started_select = time.time()
    what_ready = select.select([rawsocket], [], [], timeout)
    wait_for_time = (time.time() - started_select)
    if what_ready[0] == []: # Timeout
      return -1
    time_received = time.time()
    received_packet, addr = rawsocket.recvfrom(1024)
    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_time
    if timeout <= 0:
      return -1

  '''
  实现 ping 主机/ip
  '''


def ping(host):
  data_type = 8 # ICMP Echo Request
  data_code = 0 # must be zero
  data_checksum = 0 # "...with value 0 substituted for this field..."
  data_ID = 0 # Identifier
  data_Sequence = 1 # Sequence number
  payload_body = b'abcdefghijklmnopqrstuvwabcdefghi' # data
  dst_addr = socket.gethostbyname(host) # 将主机名转ipv4地址格式,返回以ipv4地址格式的字符串,如果主机名称是ipv4地址,则它将保持不变
  print("正在 Ping {0} [{1}] 具有 32 字节的数据:".format(host, dst_addr))
  for i in range(0, 4):
    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)))
      time.sleep(0.7)
    else:
      print("请求超时。")


if __name__ == "__main__":
  # if len(sys.argv) < 2:
  #   sys.exit('Usage: ping.py <host>')
  ping('www.baidu.com') # sys.argv[1]

二 .python实现ping返回延迟简单版本

from ping3 import ping


def ping_host(ip):
  """
  获取节点的延迟的作用
  :param node:
  :return:
  """
  ip_address = ip
  response = ping(ip_address)
  print(response)
  if response is not None:
    delay = int(response * 1000)
    print(delay, "延迟")
    # 下面两行新增的


ping_host('www.baidu.com')

以上就是python 实现ping测试延迟的两种方法的详细内容,更多关于python ping测试延迟的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中正则表达式详解
May 17 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
Python坐标线性插值应用实现
Nov 13 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
手动安装python3.6的操作过程详解
Jan 13 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
python实现股票历史数据可视化分析案例
Jun 10 Python
弄清Pytorch显存的分配机制
Dec 10 #Python
python实现经纬度采样的示例代码
Dec 10 #Python
Python urlopen()参数代码示例解析
Dec 10 #Python
Python urllib request模块发送请求实现过程解析
Dec 10 #Python
Python APScheduler执行使用方法详解
Dec 10 #Python
flask项目集成swagger的方法
Dec 09 #Python
python的dict判断key是否存在的方法
Dec 09 #Python
You might like
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
php使用正则验证中文
2016/04/06 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
jQuery中prepend()方法用法实例
2014/12/25 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
详解python3中的真值测试
2018/08/13 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
造型师求职自荐信
2013/09/27 职场文书
公司员工的自我评价范例
2013/11/01 职场文书
计算机毕业生自荐信范文
2014/03/23 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
交通事故协议书范本
2014/11/18 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python