截断二进制指数退避算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
截断二进制指数退避算法的C++实现
根据书本中对截断二进制指数退避的定义,编写如下C++代码实现,以显示其原理。运行时可自主设定传送时发生碰撞的概率,从而模拟特定网络环境。
程序会自动判断是否发生碰撞,记录重传次数,在重传前计算随机退避等待的时间。当重传16次仍未成功以及传送成功时都会有相应提示,并显示传送成功时重传的总次数。
程序涉及srand(seed)和sand()库函数用来取随机数,并用系统时间中的毫秒值t.wMilliseconds作为srand(seed)函数中的seed。
具体代码如下:
#include
#include
#include
using namespace std;
#define CONTENTION_PERIOD 51.20 //以太网中争用期时间2T(单位为微秒)
int GetRand(int min, int max) //得到min到max之间的一个随机数
{
SYSTEMTIME t;
GetSystemTime(&t); //取系统时间,格林威治时间
srand(t.wMilliseconds);
int r=rand()%(max-min+1)+min;
return r;
}
int TwoPowerK(int k) //二的k次幂
{
int a=2;
int f=1;
while(k--)
{
f*=a;
}
return f;
}
int Resend(int i) //第i次重传操作,计算重传退避时间,等待后重传
//(具休实现未定义,仅用于演示,显示退避时间)
{
int r,MAX;
double BackTime;
cout<<"开始退避操作!"< if(i<=10) MAX=TwoPowerK(i)-1; if(i>10) { cout<<"重传次数超过10,从10截止。"< MAX=TwoPowerK(10)-1; } cout<<"随机数范围:"<<"0到"< r=GetRand(0,MAX); cout<<"得到的随机数r为:"< BackTime=r*CONTENTION_PERIOD; cout<<"退避时间为:"<<"51.2*"< Sleep(200); //暂停200毫秒 cout<<"退避完成,开始重传!"< cout< return 0; } void main() { cout<<"***截断二进制退避指数算法演示***"< int k=0; //用以表示重传的次数 int p; //用于自己设置发生碰撞的概率 cout<<"每次传送发生碰撞的概率为p%,请输入p的值(范围为0到100之间的整数):"; cin>>p; cout< while(1) { if(GetRand(1,100)<=p) //如果发生碰撞,其概率为p% { k++; if(k<=16) //最大重传送次数为16 { cout<<"***发生碰撞!"<<"准备进行第"< Resend(k); continue; } if(k>16) { cout<<"重传16次仍未成功,丢弃本帧,向高层报告!"< break; } } if(GetRand(1,100)>p) //如果没有发生碰撞,其概率为1-p% { cout<<"本次未发生碰撞,传送成功!!共重传"< break; } } }