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抽象类的新写法
Jun 18 Python
Python通过正则表达式选取callback的方法
Jul 18 Python
简单谈谈python中的多进程
Nov 06 Python
python编程实现归并排序
Apr 14 Python
django实现前后台交互实例
Aug 07 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
python使用openpyxl库修改excel表格数据方法
May 03 Python
Python使用爬虫爬取静态网页图片的方法详解
Jun 05 Python
Python列表(List)知识点总结
Feb 18 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 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
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
php基于Redis消息队列实现的消息推送的方法
2018/11/28 PHP
浅谈php调用python文件
2019/03/29 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
React组件的三种写法总结
2017/01/12 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
python在windows下实现备份程序实例
2014/07/04 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
详解python 中in 的 用法
2019/12/12 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
武汉高蓝德国际.net机试
2016/06/24 面试题
什么时候需要进行强制类型转换
2016/09/03 面试题
汉语专业应届生求职信
2013/10/01 职场文书
证婚人经典证婚词
2014/01/09 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
python cv2图像质量压缩的算法示例
2021/06/04 Python
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
Python函数对象与闭包函数
2022/04/13 Python