截断二进制指数退避算法C

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