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验证码识别的方法
Jul 10 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
python八皇后问题的解决方法
Sep 27 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
python matplotlib折线图样式实现过程
Nov 04 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
Python列表倒序输出及其效率详解
Mar 04 Python
python如何随机生成高强度密码
Aug 19 Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 Python
使用Python获取字典键对应值的方法
Apr 26 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
杏林同学录(八)
2006/10/09 PHP
PHP与SQL注入攻击[一]
2007/04/17 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
js微信分享实现代码
2020/10/11 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
2018/12/20 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
Python设计密码强度校验程序
2020/07/30 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
局域网定义和特性
2016/01/23 面试题
介绍一下linux文件系统分配策略
2012/11/17 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
先进集体事迹材料
2014/02/17 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
导游词之南京中山陵
2019/11/27 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android