文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python简易版 ping

2023-01-31 01:31

关注

说明:蓝色=命令名称

      浅绿=命令参数

      浅蓝=选项

      紫色=目录

      系统环境:CentOS  5.5  x86_64

      python版本:Python 2.7.3

代码:

  1. #!/usr/bin/env python  
  2. #-*- coding:utf-8 -*-  
  3. #Author:left_left  
  4. import sys  
  5. import os  
  6. import time  
  7. import select  
  8. import struct  
  9. import socket  
  10.  
  11. def data_format(seq, id):  
  12.     sum = id + seq + 8 
  13.     sum = (sum >> 16) + (sum & 0xffff)  
  14.     sum = sum + (sum >> 16)  
  15.     sum = sum ^  0xffff 
  16.     header = struct.pack('bbHHh', 8, 0, sum,  
  17.             id, seq)  
  18.     return header  
  19.  
  20. def time_format():  
  21.     if os.name == "nt":  
  22.         return time.clock()  
  23.     else:  
  24.         return time.time()  
  25.  
  26. def recv_data(chk, t, s):  
  27.     while 1:  
  28.         r, w, x = select.select([s], [], [], 1)  
  29.           
  30.         if s in r:  
  31.             d = s.recvfrom(1024)  
  32.             p = d[0]  
  33.             if p[24:28] == chk:  
  34.                 t = time_format() - t  
  35.                 print "%d bytes from %s: icmp_seq=%d ttl=%d time=%.3f ms" % (  
  36.                         len(p), d[1][0], struct.unpack('h', p[26:28])[0], int(ord(p[8])), t*1000)  
  37.                 return 1 
  38.             else:  
  39.                 continue 
  40.         else:  
  41.             print "Request timed out ..." 
  42.             return 0 
  43.    
  44. def ping(host):  
  45.     i = 0 
  46.     sent = 0 
  47.     suc_num = 0 
  48.     id = os.getpid()  
  49.  
  50.     try:  
  51.         addr = socket.gethostbyname(host)  
  52.         if not addr:  
  53.             raise   
  54.     except:  
  55.         print "Please input the correct host ..." 
  56.         exit(1)  
  57.       
  58.     try:  
  59.         while 1:  
  60.             sent += 1 
  61.             s = socket.socket(socket.AF_INET, socket.SOCK_RAW, 1)  
  62.             data = data_format(sent, id)  
  63.             t = time_format()  
  64.             try:  
  65.                 s.sendto(data, (addr, 1))  
  66.             except socket.error:  
  67.                 print "Count connect %s" % host  
  68.                 exit(1)  
  69.  
  70.             i = recv_data(data[-4:], t, s)  
  71.             suc_num += i  
  72.             time.sleep(1)  
  73.     except KeyboardInterrupt:  
  74.         print "-------- %s ping statistics --------" % host  
  75.         print r"%d packets transmitted, %d received, %d%% packet loss" %(sent,   
  76.                 suc_num, (sent-suc_num)*100/ sent )  
  77.  
  78. def main():  
  79.     try:  
  80.         host = sys.argv[1]  
  81.     except IndexError:  
  82.         print "Missing host ..." 
  83.         exit(1)  
  84.  
  85.     ping(host)  
  86.  
  87. if __name__ == '__main__':  
  88.     main() 

效果

结束语:

本程序只是简单的实现了ping功能,和真正的ping还有很大的差距,只是用来测试一下对icmp的掌握程度,忘各路大神指点。

通过程序去理解协议是个不错的方法O(∩_∩)O~

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯