丢包率实时刷新计算
每来一包都会刷新一次丢包率,最多统计前一百包,正常收到的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;
}