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中对list去重的多种方法
Sep 18 Python
Python生成密码库功能示例
May 23 Python
深入理解Python中的*重复运算符
Oct 28 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
python实现简易云音乐播放器
Jan 04 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
python reverse反转部分数组的实例
Dec 13 Python
详解如何设置Python环境变量?
May 13 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
Python openpyxl模块实现excel读写操作
Jun 30 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
德生PL330的评价与改造
2021/03/02 无线电
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
关于PHP内存溢出问题的解决方法
2013/06/25 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
Python根据当前日期取去年同星期日期
2019/04/14 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
python实现梯度法 python最速下降法
2020/03/24 Python
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
校园安全标语
2014/06/07 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
老乡聚会通知
2015/04/23 职场文书
个人催款函范文
2015/06/24 职场文书
病房管理制度范本
2015/08/06 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android