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的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
May 20 Python
关于Python中空格字符串处理的技巧总结
Aug 10 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Django实现学生管理系统
Feb 26 Python
python for循环remove同一个list过程解析
Aug 14 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
解决reload(sys)后print失效的问题
Apr 25 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
python简单实现插入排序实例代码
Dec 16 Python
python使用pymysql模块操作MySQL
Jun 16 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
收音机的保养
2021/03/01 无线电
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
如何在php中正确的使用json
2013/08/06 PHP
php自定义错误处理用法实例
2015/03/20 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
轮播图组件js代码
2016/08/08 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
python遍历数组的方法小结
2015/04/30 Python
python相似模块用例
2016/03/04 Python
python unittest实现api自动化测试
2018/04/04 Python
flask框架视图函数用法示例
2018/07/19 Python
python实现定时发送qq消息
2019/01/18 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
幼儿园小班评语
2014/04/18 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
年度评优评先方案
2014/06/03 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL
Python 视频画质增强
2022/04/28 Python