发送过程中有冲突的情况_第1页
发送过程中有冲突的情况_第2页
发送过程中有冲突的情况_第3页
发送过程中有冲突的情况_第4页
发送过程中有冲突的情况_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、北京工商大学课 程 设 计 实 践 报 告学院: 计算机与信息工程学院 课程名称: 计算机网络技术 任课教师: 陈谊 班级: 学号: 姓名: 同组: 成绩(百分制): 实践地点: 计算机学院综合实验室 实践时间: 2015 年 6 月 课程设计题目模拟:Ethernet帧的发送过程一、 设计内容及设计要求设计内容: 目前,Ethernet是应用最广泛的局域网。因此,学习Ethernet技术对深入掌握局域网知识非常重要。本课程设计的目的是模拟Ethernet帧的发送过程,事读者熟悉Ethernet帧的数据发送流程,及CSMA/CD工作流程。编写程序模拟Ethernet。子任务描述: 编程实现发送

2、数据的过程中遇到碰撞的情况设计要求:1、 了解CSMA/CD工作原理及过程: 它的工作原理是: 发送数据前 先侦听信道是否空闲 ,若空闲,则立即发送数据。若信道忙碌,则等待一段时间至信道中的信息传输结束后再发送数据;若在上一段信息发送结束后,同时有两个或两个以上的节点都提出发送请求,则判定为冲突。若侦听到冲突,则立即停止发送数据,等待一段随机时间,再重新尝试。其原理简单总结为:先听后发,边发边听,冲突停发,随机延迟后重发2、 明白在发送数据的过程遇到碰撞时的处理流程,并编程模拟相应操作。二、 总体设计总体设计流程图 图 1 总体设计流程图三、 详细设计及代码详细设计步骤:1) 打印发送冲突,将

3、总线标志位置为空闲Bus = 0.2) 判断当前线程是哪个线程,如果是线程a,ID = ID1,则转3);否则转7)。3) 线程a的冲突计数器-1,即可尝试次数-1, CollisionCounterA -.4) 判断线程a的冲突计数器是否为0,如果是,则报告发送失败;否则,转5)。5) 通过二进制指数后退算法计算随机延迟时间,并延迟6) 进行下一次尝试。7) 线程b的处理情况同线程a类似。详细设计流程图: 图2 详细设计流程图核心代码:int CollideInSending(DWORD ID) /发送过程中有冲突的情况/ID为线程号/如果返回1,则说明线程a的冲突计数器>0,可再尝试

4、发送/如果返回2,则说明线程b的冲突计数器>0,可再尝试发送printf("%d Send Collisionn", ID); /发生冲突Bus = 0; /双方都停止发送,总线又处于空闲状态if(ID = ID1) /如果当前线程是a线程CollisionCounterA-; /主机a的冲突计数器-1,可尝试测试次数-1if(CollisionCounterA>0)/随机延迟重发,延迟算法用截止二进制指数后退算法 backoff(CollisionCounterA);return 1; /下一次尝试发送elseprintf("%d Send Fail

5、uren", ID); /发送次数超过16次,宣布发送失败 else /如果是b线程CollisionCounterB-; /主机b的冲突计数器-1,可尝试测试次数-1if(CollisionCounterB>0)/随机延迟重发,延迟算法用截止二进制指数后退算法 backoff(CollisionCounterA);return 2; /下一次尝试发送elseprintf("%d Send Failuren", ID); /发送次数超过16次,宣布发送失败return 0;详细代码:#include "math.h"#include &q

6、uot;afxwin.h"#include "stdlib.h"typedef unsigned int UINT;/定义线程与共享内存DWORD ID1, ID2, Bus=0; /两个线程ID,总线程标志void backoff(int CollisionCounter); /二进制指数后退算法int CollideInSending(DWORD ID); /发送过程中有冲突的情况int CollisionCounterA = 16; /主机a冲突计数器int CollisionCounterB = 16; /主机b冲突计数器int ia = 0; /主机a发

7、送成功的次数int ib = 0; /主机b发送成功的次数double Contention_Period = 0.0512; /争用期 51.2微秒int Anum = 5; /用户所设置的主机a要发送数据的次数,默认为5int Bnum = 5; /用户所设置的主机b要发送数据的次数,默认为5int Cwind = 0; /用户所设置的冲突窗口大小void backoff(int CollisionCounter) /二进制指数后退算法double back; /退避时间int randNum; /随机数srand(int)time(0); /设置rand()产生随机数时的随机数种子int

8、 k = CollisionCounter;k = 16 - k; /k 为重传次数 if(k>10)k = 10; /重传次数不能>10randNum = rand()%(int)pow(2, k); /随机数 0,2k-1,同时<210/随机延迟重发,延迟算法用截止二进制指数后退算法back = randNum * Contention_Period; /退避时间Sleep(back);/printf("randNum=%d (0 2%d-1 = %d)n", randNum, k, (int)pow(2, k)-1);/printf("退避

9、时间为:%d * %.4lf = %.3lf msn", randNum, Contention_Period, back);int CollideInSending(DWORD ID) /发送过程中有冲突的情况/ID为线程号/如果返回1,则说明线程a的冲突计数器>0,可再尝试发送/如果返回2,则说明线程b的冲突计数器>0,可再尝试发送printf("%d Send Collisionn", ID); /发生冲突Bus = 0; /双方都停止发送,总线又处于空闲状态if(ID = ID1) /如果当前线程是a线程CollisionCounterA-;

10、/主机a的冲突计数器-1,可尝试测试次数-1if(CollisionCounterA>0)/随机延迟重发,延迟算法用截止二进制指数后退算法 backoff(CollisionCounterA);return 1; /下一次尝试发送elseprintf("%d Send Failuren", ID); /发送次数超过16次,宣布发送失败 else /如果是b线程CollisionCounterB-; /主机b的冲突计数器-1,可尝试测试次数-1if(CollisionCounterB>0)/随机延迟重发,延迟算法用截止二进制指数后退算法 backoff(Colli

11、sionCounterA);return 2; /下一次尝试发送elseprintf("%d Send Failuren", ID); /发送次数超过16次,宣布发送失败return 0;int main()ID2 = 8862;while(1)if(CollideInSending(ID1)=1) /返回1,则说明线程a的冲突计数器>0,可再尝试发送continue; /再次尝试发送else /线程a的冲突计数器=0,发送失败break;return 0;四、 调试及运行结果运行结果结果分析: 在主函数中设置线程a的线程号为8862在主函数中。本程序中,数据用线程号进行模拟

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论