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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
利用python将图片转换成excel文档格式
Dec 30 Python
彻底搞懂Python字符编码
Jan 23 Python
Python实现的栈(Stack)
Jan 26 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
pytorch实现手写数字图片识别
May 20 Python
pandas取dataframe特定行列的实现方法
May 24 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授权问题总结
2007/05/06 PHP
解析:使用php mongodb扩展时 需要注意的事项
2013/06/18 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
vue实现循环切换动画
2018/10/17 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python enumerate内置函数用法总结
2020/01/07 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
市场营销专业求职信
2014/06/17 职场文书
工程造价专业求职信
2014/07/17 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
融资合作协议书范本
2014/10/17 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
Spring中bean集合注入的方法详解
2022/07/07 Java/Android