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 相关文章推荐
Android应用开发中Action bar编写的入门教程
Feb 26 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
python爬虫 execjs安装配置及使用
Jul 30 Python
PyTorch中的padding(边缘填充)操作方式
Jan 03 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
Python中if有多个条件处理方法
Feb 26 Python
pytorch实现查看当前学习率
Jun 24 Python
利用Python+OpenCV三步去除水印
May 28 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
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
php实现对象克隆的方法
2015/06/20 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
Python龙贝格法求积分实例
2020/02/29 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
普天C++笔试题
2016/03/20 面试题
冰淇淋开店创业计划书
2014/02/01 职场文书
小松树教学反思
2014/02/11 职场文书
cf收人广告词
2014/03/14 职场文书
超市活动计划书
2014/04/24 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
国际贸易专业求职信
2014/06/04 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
功夫熊猫观后感
2015/06/10 职场文书