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的轻便web框架Bottle
Apr 08 Python
Python下线程之间的共享和释放示例
May 04 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
python SMTP实现发送带附件电子邮件
May 22 Python
解决python中无法自动补全代码的问题
Dec 04 Python
Python文件如何引入?详解引入Python文件步骤
Dec 10 Python
Python中遍历列表的方法总结
Jun 27 Python
django Admin文档生成器使用详解
Jul 22 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
如何利用Python实现一个论文降重工具
Jul 09 Python
如何利用python实现列表嵌套字典取值
Jun 10 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
追求程序速度,而不是编程的速度
2008/04/23 PHP
JavaScript 常用函数
2009/12/30 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
vue监听对象及对象属性问题
2018/08/20 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
js尾调用优化的实现
2019/05/23 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
电气专业应届生求职信
2013/11/01 职场文书
大学生个人自我鉴定
2013/12/03 职场文书
办理护照介绍信
2014/01/16 职场文书
班组安全员工作职责
2014/02/01 职场文书
小学教师师德感言
2014/02/10 职场文书
团日活动总结书格式
2014/05/08 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
英文商务邀请函范文
2015/01/31 职场文书
消费者理赔投诉书
2015/07/02 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL