前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python简易版 ping

python简易版 ping

作者头像
py3study
发布2020-01-14 14:58:28
4700
发布2020-01-14 14:58:28
举报
文章被收录于专栏:python3

说明:蓝色=命令名称

浅绿=命令参数

浅蓝=选项

紫色=目录

      系统环境:CentOS  5.5  x86_64

python版本:Python 2.7.3

代码:

代码语言:javascript
复制
#!/usr/bin/env python  
#-*- coding:utf-8 -*-  
#Author:left_left  
import sys  
import os  
import time  
import select  
import struct  
import socket  
 
def data_format(seq, id):  
    sum = id + seq + 8 
    sum = (sum >> 16) + (sum & 0xffff)  
    sum = sum + (sum >> 16)  
    sum = sum ^  0xffff 
    header = struct.pack('bbHHh', 8, 0, sum,  
            id, seq)  
    return header  
 
def time_format():  
    if os.name == "nt":  
        return time.clock()  
    else:  
        return time.time()  
 
def recv_data(chk, t, s):  
    while 1:  
        r, w, x = select.select([s], [], [], 1)  
          
        if s in r:  
            d = s.recvfrom(1024)  
            p = d[0]  
            if p[24:28] == chk:  
                t = time_format() - t  
                print "%d bytes from %s: icmp_seq=%d ttl=%d time=%.3f ms" % (  
                        len(p), d[1][0], struct.unpack('h', p[26:28])[0], int(ord(p[8])), t*1000)  
                return 1 
            else:  
                continue 
        else:  
            print "Request timed out ..." 
            return 0 
   
def ping(host):  
    i = 0 
    sent = 0 
    suc_num = 0 
    id = os.getpid()  
 
    try:  
        addr = socket.gethostbyname(host)  
        if not addr:  
            raise   
    except:  
        print "Please input the correct host ..." 
        exit(1)  
      
    try:  
        while 1:  
            sent += 1 
            s = socket.socket(socket.AF_INET, socket.SOCK_RAW, 1)  
            data = data_format(sent, id)  
            t = time_format()  
            try:  
                s.sendto(data, (addr, 1))  
            except socket.error:  
                print "Count connect %s" % host  
                exit(1)  
 
            i = recv_data(data[-4:], t, s)  
            suc_num += i  
            time.sleep(1)  
    except KeyboardInterrupt:  
        print "-------- %s ping statistics --------" % host  
        print r"%d packets transmitted, %d received, %d%% packet loss" %(sent,   
                suc_num, (sent-suc_num)*100/ sent )  
 
def main():  
    try:  
        host = sys.argv[1]  
    except IndexError:  
        print "Missing host ..." 
        exit(1)  
 
    ping(host)  
 
if __name__ == '__main__':  

效果

结束语:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档