python简易版 ping

发布时间:2019-07-16 10:09:38编辑:auto阅读(1880)

    说明蓝色=命令名称

          浅绿=命令参数

          浅蓝=选项

          紫色=目录

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

    效果

    结束语:

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

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

关键字

上一篇: python学习-游戏

下一篇: 用python备份文件