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性能优化的20条建议
Oct 25 Python
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
python线程、进程和协程详解
Jul 19 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
pycharm重命名文件的方法步骤
Jul 29 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
python函数中将变量名转换成字符串实例
May 11 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php中http_build_query 的一个问题
2012/03/25 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
关于js datetime的那点事
2011/11/15 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
使用python绘制常用的图表
2016/08/27 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
浅析matlab中imadjust函数
2020/02/27 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
《尊严》教学反思
2014/02/11 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers