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中使用第三方模块的教程
Apr 27 Python
python中assert用法实例分析
Apr 30 Python
关于Python数据结构中字典的心得
Dec 04 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
Sanic框架路由用法实例分析
Jul 16 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Python 如何对文件目录操作
Jul 10 Python
Python如何爬取b站热门视频并导入Excel
Aug 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
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
jquery链式操作的正确使用方法
2014/01/06 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
JavaScript中this详解
2015/09/01 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
keras 多任务多loss实例
2020/06/22 Python
python利用opencv实现颜色检测
2021/02/23 Python
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
自荐信如何“自荐”
2013/10/24 职场文书
求职信范文怎么写
2014/01/29 职场文书
趣味比赛活动方案
2014/02/15 职场文书
合作协议书范本
2014/10/25 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
海弦WR-800F
2022/04/05 无线电