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 相关文章推荐
Windows下安装python2.7及科学计算套装
Mar 05 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
解决Python安装后pip不能用的问题
Jun 12 Python
Django中的FBV和CBV用法详解
Sep 15 Python
Python Tornado核心及相关原理详解
Jun 24 Python
python 19个值得学习的编程技巧
Aug 15 Python
python操作链表的示例代码
Sep 27 Python
Python Http请求json解析库用法解析
Nov 28 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 Python
pandas中关于apply+lambda的应用
Feb 28 Python
Python内置数据类型中的集合详解
Mar 18 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中养成7个面向对象的好习惯
2010/07/17 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
javascript 简练的几个函数
2009/08/29 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
Python实现的单向循环链表功能示例
2017/11/10 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
html5弹跳球示例代码
2013/07/23 HTML / CSS
如何定义一个可复用的服务
2014/09/30 面试题
文明餐桌活动方案
2014/02/11 职场文书
暑期社会实践感言
2014/02/25 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js