说明蓝色=命令名称

      浅绿=命令参数

      浅蓝=选项

      紫色=目录

      系统环境: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'80, 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() 

效果

python简易版 ping_python ping

结束语:

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

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