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单线程实现多个定时器示例
Mar 30 Python
python实现sublime3的less编译插件示例
Apr 27 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
对Python3 序列解包详解
Feb 16 Python
学习和使用python的13个理由
Jul 30 Python
python从内存地址上加载python对象过程详解
Jan 08 Python
关于Tensorflow分布式并行策略
Feb 03 Python
Python命令行参数argv和argparse该如何使用
Feb 08 Python
yolov5返回坐标的方法实例
Mar 17 Python
Python学习之迭代器详解
Apr 01 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 jQuery表单,带验证具体实现方法
2014/02/15 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
javascript arguments使用示例
2014/12/16 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
Python制作爬虫采集小说
2015/10/25 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
Python并行分布式框架Celery详解
2018/10/15 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
公司前台辞职报告
2014/01/19 职场文书
机电专业求职信
2014/06/14 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
服装店员工管理制度
2015/08/07 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
Pandas数据类型之category的用法
2021/06/28 Python
Java死锁的排查
2022/05/11 Java/Android