python实现ping命令小程序


Posted in Python onDecember 28, 2020

ping的原理是发送一个ICMP请求包,然后根据目的地址的应答包来判断是否能够和这个主机进行通信。
我们使用python实现,借助于scapy来进行编写程序。

from scapy.all import *
import time,struct,random
# 编写ping一个包的函数。
def ping_one(dst = '36.152.44.95',ttl_no = 64,id_no = 345,seq_no = 5):
  start_time = time.time()
  # 将时间转换为二进制序列。
  time_to_bytes = struct.pack('>d',start_time)
  # 进行发送ICMP包,发送出去一个,收回来一个。
  ping_one_result = sr1(IP(dst = dst,ttl = ttl_no)/ICMP(seq = seq_no,id = id_no)/time_to_bytes, timeout = 1, verbose=False)
  # print(ping_one_result.show())
  # 判断收回来的包是不是ICMP的应答包,和序列号是否相同。
  try:
    if ping_one_result.getlayer('ICMP').type == 0 and ping_one_result.getlayer('ICMP').seq == seq_no:
      # print('进行解析包')
      # 提取IP头部中的源IP地址,也就是我们ping的IP地址。
      reply_src_IP = ping_one_result.getlayer('IP').src
      # 提取序列号。
      reply_icmp_seq = ping_one_result.getlayer('ICMP').seq
      # 提取ttl
      reply_icmp_ttl = ping_one_result.getlayer('IP').ttl
      # 数据长度等于 数据长度(Raw) + 垫片长度(Padding) + 8字节(ICMP头部长度)
      if ping_one_result.getlayer(Raw) != None:
        Raw_length = len(ping_one_result.getlayer(Raw).load)
      else:
        Raw_length = 0
      if ping_one_result.getlayer(Padding) != None:
        Padding_length = len(ping_one_result.getlayer(Padding).load)
      else:
        Padding_length = 0
      # 计算数据长度。
      reply_data_length = Raw_length + Padding_length + 8
      # 取出数据部分,这里的数据部分是我们发送ICMP请求包的时候填入的时间。
      reply_data = ping_one_result.getlayer(Raw).load
      # 定义我们收包的时间。
      end_time = time.time()
      # 将数据时间部分进行转换。
      reply_data_time = struct.unpack('>d',reply_data)
      # 然后打印出转换后的类型。
      # print(type(reply_data_time))
      # print(reply_data_time)
      time_to_pass_ms = (end_time - reply_data_time[0]) * 1000
      # (接收时间 - 发送时间) * 1000为毫秒数为消耗时间的毫秒数
      # print(time_to_pass_ms)
      return reply_data_length,reply_src_IP,reply_icmp_seq,reply_icmp_ttl,time_to_pass_ms
  except Exception as e:
    # 打印出错误。
    # print('e', e)
    # 匹配错误是否为NoneType类型。
    if re.match('.*NoneType.*', str(e)):
      print('错误了')
      # 如果没有回应,就返回None
      return None
def ping(dst = '36.152.44.95'):
  # 这里其实可以取进程号的,但是我们用随机生成一个数字模拟一下。
  id_no = random.randint(0,65535)
  # print(id_no)
  # 然后进行发送5个数据包。
  for i in range(1,6):
    # 调用ping一个包函数,入参为目的需要ping的IP地址。ttl,id,和序列号。seq。
    ping_result = ping_one(dst,64,id_no,i)
    if ping_result != None:
      print('%d bytes from %s: icmp_seq=%d ttl=%d time=%4.2f ms' % (ping_result[0], ping_result[1], ping_result[2], ping_result[3], ping_result[4]))
    else:
      print('.',end = '',flush = True)
    # 这里我们暂停一秒。
    time.sleep(1)

if __name__ == "__main__":
  ping('36.152.44.95')

但现在为止,我们的ping小程序就用python实现了,接下来就可以用wireshark工具抓包来看一下,进行ping百度的地址。

python实现ping命令小程序

以上就是python实现ping命令小程序的详细内容,更多关于python ping命令的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
解决python matplotlib imshow无法显示的问题
May 24 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
python numpy元素的区间查找方法
Nov 14 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
pytorch: Parameter 的数据结构实例
Dec 31 Python
python实现简单的购物程序代码实例
Mar 03 Python
Python通用唯一标识符uuid模块使用案例
Sep 10 Python
python 决策树算法的实现
Oct 09 Python
基于python实现银行管理系统
Apr 20 Python
Python基础之进程详解
May 21 Python
如何用python 操作zookeeper
Dec 28 #Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 #Python
Python用Jira库来操作Jira
Dec 28 #Python
python性能测试工具locust的使用
Dec 28 #Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 #Python
python字典与json转换的方法总结
Dec 28 #Python
python字典按照value排序方法
Dec 28 #Python
You might like
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
php使用百度天气接口示例
2014/04/22 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
基于jquery实现放大镜效果
2015/08/17 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
jQuery中$原理实例分析
2018/08/13 jQuery
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
python字符串替换示例
2014/04/24 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
python 进程 进程池 进程间通信实现解析
2019/08/23 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
自我评价如何写好?
2014/01/05 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
店长岗位职责
2015/02/11 职场文书
辞职信范文大全
2015/03/02 职场文书
前台岗位职责范本
2015/04/16 职场文书
js之ajax文件上传
2021/05/13 Javascript
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android