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写的ARP攻击代码实例
Jun 04 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
Python实现读取文件最后n行的方法
Feb 23 Python
Python使用functools实现注解同步方法
Feb 06 Python
python实现各种插值法(数值分析)
Jul 30 Python
python ftplib模块使用代码实例
Dec 31 Python
pytorch实现MNIST手写体识别
Feb 14 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
详解Python设计模式之策略模式
Jun 15 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 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 stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
使用PDB模式调试Python程序介绍
2015/04/05 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
Python实现视频下载功能
2017/03/14 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
浅析matlab中imadjust函数
2020/02/27 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
linux面试题参考答案(6)
2016/06/23 面试题
爱情寄语大全
2014/04/09 职场文书
《火烧云》教学反思
2014/04/12 职场文书
初三新学期计划书
2014/05/03 职场文书
企业愿景口号
2015/12/25 职场文书
公证书
2019/04/17 职场文书