根据序列号统计丢包率

丢包率实时刷新计算


每来一包都会刷新一次丢包率,最多统计前一百包,正常收到的seq序列号是每包增加一个的,只需要在协议发送端递增seq号就可以在协议接收端通过收到的seq计算丢包率。

#define CHECK_AMOUNT    128//0-127检查的数量,也就是序号的变化范围
#define VALUE_ADD(A,B)  ((A+B)>=CHECK_AMOUNT ?   (A+B-CHECK_AMOUNT)  :    (A+B))
#define VALUE_SUB(A,B)  ( A<B ?   (A+CHECK_AMOUNT-B)  :    (A-B))
uint8_t seq_head,seq_tail,last_seq;
bool first_in =true ;

bool lost_flig[CHECK_AMOUNT]={0};

uint8_t losstpock_ratio(uint8_t seqin)
{
    uint8_t lost_num;
    if(first_in)
    {
        first_in=false;
        last_seq=VALUE_SUB(seqin,1);
        seq_head=last_seq;
        seq_tail=seqin;
        lost_num=0;
    }
    seq_tail=seqin;

    if(seqin!=VALUE_ADD(last_seq,1))//丢包
    {
        lost_num=VALUE_SUB(VALUE_SUB(seqin,last_seq),1);//丢包个数
        for (uint8_t i = 0; i < lost_num; i++)//0到丢包个数-1
        {
            
            lost_flig[VALUE_SUB(VALUE_SUB(seqin,i),1)]=true;//记录所有丢包序号
        }
    }

    if(VALUE_SUB(seq_tail,seq_head)>=100)//只统计当前包前100包的范围
    {
        seq_head=VALUE_SUB(seq_tail,100);
    }
    uint8_t range=VALUE_SUB(seq_tail,seq_head);//
    lost_num=0;
    for (uint8_t i = 0; i < range; i++)//统计整个范围内丢了多少包
    {
        
        if(lost_flig[VALUE_SUB(VALUE_SUB(seqin,i),1)])
        lost_num++;
    }

    float lost_numf=lost_num,rangef=range;
    float lost_ratid=lost_numf/rangef;
    lost_ratid*=100;
    last_seq=seqin;

    return lost_ratid;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值