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中的__new__特殊方法
Jun 02 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
Python实现图片转字符画的代码实例
Feb 22 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
Python玩转加密的技巧【推荐】
May 13 Python
python pygame实现五子棋小游戏
Oct 26 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 Python
Python 使用dict实现switch的操作
Apr 07 Python
使用python求解迷宫问题的三种实现方法
Mar 17 Python
python_tkinter事件类型详情
Mar 20 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 Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
python中的列表推导浅析
2014/04/26 Python
Python中字符串的修改及传参详解
2016/11/30 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
C语言基础笔试题
2013/04/27 面试题
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
如何理解委托
2012/01/06 面试题
幼师专业求职推荐信
2013/11/08 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
关于python爬虫应用urllib库作用分析
2021/09/04 Python
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
TS 类型兼容教程示例详解
2022/09/23 Javascript