截断二进制指数退避算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

}

}

相关文档
最新文档