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抓取京东图书评论数据
Aug 31 Python
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
python实现二维插值的三维显示
Dec 17 Python
python三方库之requests的快速上手
Mar 04 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
python实现图片横向和纵向拼接
Mar 05 Python
Python tcp传输代码实例解析
Mar 18 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 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数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
django中的ajax组件教程详解
2018/10/18 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
详解爬虫被封的问题
2019/04/23 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
法学专业应届生求职信
2013/10/16 职场文书
土木工程毕业生推荐信
2013/10/28 职场文书
高三自我评价
2014/02/01 职场文书
团拜会策划方案
2014/06/07 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书