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中的数据存储模块shelve的用法
Mar 03 Python
python处理xml文件的方法小结
May 02 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
Django框架视图函数设计示例
Jul 29 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
Python如何测试stdout输出
Aug 10 Python
Python datetime 如何处理时区信息
Sep 02 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
python opencv将多个图放在一个窗口的实例详解
Feb 28 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发送html格式文本邮件的方法
2015/06/10 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP中each与list用法分析
2016/01/08 PHP
php文件上传类完整实例
2016/05/14 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
基于python实现简单日历
2018/07/28 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
旅游市场营销方案
2014/03/09 职场文书
离婚起诉书范本
2015/05/18 职场文书
单位更名证明
2015/06/18 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
java设计模式--原型模式详解
2021/07/21 Java/Android