计算机网络课程设计报告中国地质大学武汉.doc

上传人:laozhun 文档编号:3434252 上传时间:2023-03-13 格式:DOC 页数:26 大小:528KB
返回 下载 相关 举报
计算机网络课程设计报告中国地质大学武汉.doc_第1页
第1页 / 共26页
计算机网络课程设计报告中国地质大学武汉.doc_第2页
第2页 / 共26页
计算机网络课程设计报告中国地质大学武汉.doc_第3页
第3页 / 共26页
计算机网络课程设计报告中国地质大学武汉.doc_第4页
第4页 / 共26页
计算机网络课程设计报告中国地质大学武汉.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《计算机网络课程设计报告中国地质大学武汉.doc》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告中国地质大学武汉.doc(26页珍藏版)》请在三一办公上搜索。

1、计算机网络课程设计报告学院: 计算机学院 专业:计算机科学与技术 教师: 班级: 姓名: 学号: 源码在CSDN上有目 录题目一 02题目二 07题目三 17总结 24题目一:P105:3-07,为该数据添加CRC码,并验证他的正确性,改动CRC码最后一位,验证他的正确性。题目介绍:循环冗余检验(CRC)的原理是在发送端,先把数据划分为组,假定每组k个比特。现假定待传送的数据M。CRC运算就是在数据M后面添加供差错检测用的n位冗余码,然后构成一个帧发出去,一共发送(k + n)位。在接收端把接收到的数据以帧为单位进行CRC检验:把收到的的每一个帧都除以同样的除数(模2运算),然后检测余数,如果

2、传输过程中没有差错,得到的余数肯定为0,如果出现误码,那么余数等于0的概率是非常小的。算法说明:求余数的算法采用逐位比较的方法,每次从被除数(CString类型的字符)的前段取出与除数相同的位数,进行逐位比较,如果相同结果则为0,不同结果则为1,然后得到一个比较后的结果。删除被除数前被取出的字段,把比较后的结果连接到被除数前。此时的被除数位数不变,前边至少有一位为0,然后利用循环控制,把被除数前端的0位删除。然后重复之前的步骤,直到被除数的位数小于除数的位数,此时的剩下的被除数就是余数。然后检测余数的位数,若位数比除数的位数减1还要小,则在余数前端补0,使余数的位数等于除数的位数减1。校验算法

3、与求余数的算法类似,根据接收到的数据和预先商定的除数,进行计算,求出余数,若余数为0,则传输的数据无误,若余数不为0,则传输过程中产生了错误。算法流程图如下所示:按位比较N将被除数前几位用结果替换除去被除数前端为0的位取出被除数前端与除数相同的位数算法开始Y判断被除数的位数是否小于除数的位数获取被除数和除数获得余数,算法结束程序流程图:程序开始输入源数据和除数计算冗余码(余数)人为改动接收数据(或者不改动)校验改动后的数据程序结束运行截图:计算冗余校验码:改变接收序列主要代码实现:1. 计算冗余码函数如下:void CMy01Dlg:OnBtnCount() / TODO: Add your

4、control notification handler code hereUpdateData(TRUE);CString num1 = m_num1;/被除数CString num2 = m_num2;/除数CString send = num1;CString rcv;CString r;/余数CString temp = ;CString pre;int l1,l2; /被除数,除数的长度l1 = num1.GetLength();/获取被除数长度l2 = num2.GetLength();/获取除数长度/被除数后添加n-1个0for (int i = 0;i l2-1;i+)num1

5、 = num1 + 0;/按位与运算while(1)pre = num1.Left(l2);for (i = 0;i l2;i+)if (pre.Mid(i,1) = num2.Mid(i,1)temp = temp + 0;if (pre.Mid(i,1) != num2.Mid(i,1)temp = temp + 1;num1.Delete(0,l2);/删除被除数前的数据num1 = temp + num1;/将结果加在被除数前/去除被除数前边的为0位while(num1.Left(1) = 0)num1.Delete(0,1);l1 = num1.GetLength();/获取被除数长

6、度if(l1 EnableWindow(FALSE);GetDlgItem(IDC_EDIT_NUM2)-EnableWindow(FALSE);UpdateData(FALSE);2. 检测接收数据函数如下:void CMy01Dlg:OnBtnCheck() / TODO: Add your control notification handler code hereUpdateData(TRUE);CString num2 = m_num2;/除数CString rcv = m_rcv;CString r;/余数CString temp = ;CString pre;int l1,l2;

7、 /被除数,除数的长度l2 = num2.GetLength();/获取除数长度/按位与运算while(1)pre = rcv.Left(l2);for (int i = 0;i l2;i+)if (pre.Mid(i,1) = num2.Mid(i,1)temp = temp + 0;if (pre.Mid(i,1) != num2.Mid(i,1)temp = temp + 1;rcv.Delete(0,l2);/删除被除数前的数据rcv = temp + rcv;/将结果加在被除数前/去除被除数前边的为0位while(rcv.Left(1) = 0)rcv.Delete(0,1);l1

8、= rcv.GetLength();/获取被除数长度if(l1 = l2-1)break;elsetemp = ;r = rcv;/余数/余数去0while(r.Left(1) = 0)r.Delete(0,1);if (r = )MessageBox(接收序列正确!,);elseMessageBox(接收序列错误!,);题目二:P126:图4-16:加载RIP协议 ,得到R1,R2,R3的路由表。题目介绍:路由信息协议(RIP)是一种基于距离向量的路由选择协议,要求每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。每一个路由器仅和相邻的路由器交换信息;路由器交换的信息是当前路由器所

9、知道的全部信息,即自己的路由表;路由器按照固定的时间间隔交换路由信息,当网络拓扑结构发生变化时,路由器也能及时向相邻路由器通告拓扑变化后的路由信息。其中交换信息是按照距离向量算法进行更新信息。算法说明:本程序的核心算法是距离向量算法,算法的步骤如下所示:用定时器控制,每个一定时间,首先对地址为X的相邻路由器发来的RIP报文,先将下一跳字段中的地址都改为X,并把所有的距离字段的值加1。然后对修改后的RIP报文的每一个项目,查询本机的路由表,若本机路由表中没有网络N,则把该项目添加到本机路由表中,否则,若下一跳地址是X,则用收到的项目替换原来的项目,若下一跳地址不是X,收到项目中的距离小于原距离时

10、进行更新,除以上情况,什么都不做。算法流程图如下所示:算法开始获取相邻路由器的路由表,处理信息原路由表中无网络NY把该项添加到路由表中N下一跳地址是XY替换原路由表中的项目收到d小于原距离距离NYNRIP报文循环完毕YN算法结束程序流程图:程序开始获取并修改相邻路由器的路由表每个固定时间更新按照上述算法更新路由表路由表是否更新完毕NY程序结束运行截图:初始化:更新路由表:主要代码实现:1. 设定定时器模块void CMy02Dlg:OnBtnUpdate() SetTimer(1,5000,NULL);SetTimer(2,7000,NULL);SetTimer(3,9000,NULL);2.

11、 定时器消息响应函数模块void CMy02Dlg:OnTimer(UINT nIDEvent) UpdateData(TRUE);int i,j,k,sign;CString temp53;if (nIDEvent = 1)/初始化临时数组for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;/R1学习R2的路由表for(i = 0;i m_r2.GetItemCount();i+)tempi0 = m_r2.GetItemText(i,0);tempi1 = m_r2.GetItemText(i,1);tempi2 = m_r2.GetItemText(

12、i,2);i = 0;while(tempi1 != )k = atoi(tempi1.GetBuffer(0);k+;/距离加1tempi1.Format(%d,k);tempi2 = R2;/下一跳改为R2i+;/根据R2的路由表更新R1的路由表for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r1.GetItemCount();i+)/若路由表中有该网络if (m_r1.GetItemText(i,0) = tempj0)sign = 1;/表示有该网络if (m_r1.GetItemText(i,2

13、) = tempj2)/若下一跳是X,则替换m_r1.SetItemText(i,1,tempj1);else/下一跳地址不是Xif (atoi(tempj1.GetBuffer(0) atoi(m_r1.GetItemText(i,1).GetBuffer(0)/若新距离小于原距离,则更新距离和下一跳地址m_r1.SetItemText(i,1,tempj1);m_r1.SetItemText(i,2,tempj2);if (sign = 0)LV_ITEM IvItem;int nIndex = m_r1.GetItemCount();IvItem.mask = LVIF_TEXT;IvI

14、tem.iItem = nIndex;IvItem.iSubItem = 0;IvItem.pszText =;m_r1.InsertItem(&IvItem);m_r1.SetItemText(nIndex,0,tempj0);m_r1.SetItemText(nIndex,1,tempj1);m_r1.SetItemText(nIndex,2,tempj2);if (nIDEvent = 2)for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;for(i = 0;i m_r1.GetItemCount();i+)tempi0 = m_r1.GetIte

15、mText(i,0);tempi1 = m_r1.GetItemText(i,1);tempi2 = m_r1.GetItemText(i,2);i = 0;while(tempi1 != )k = atoi(tempi1.GetBuffer(0);k+;/距离加1tempi1.Format(%d,k);tempi2 = R1;/下一跳改为R1i+;for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r2.GetItemCount();i+)if (m_r2.GetItemText(i,0) = tempj0

16、)sign = 1;/表示有该网络if (m_r2.GetItemText(i,2) = tempj2)/若下一跳地址是X,则替换m_r2.SetItemText(i,1,tempj1);else/下一跳地址不是Xif (atoi(tempj1.GetBuffer(0) atoi(m_r2.GetItemText(i,1).GetBuffer(0)m_r2.SetItemText(i,1,tempj1);m_r2.SetItemText(i,2,tempj2);if (sign = 0)LV_ITEM IvItem;int nIndex = m_r2.GetItemCount();IvItem

17、.mask = LVIF_TEXT;IvItem.iItem = nIndex;IvItem.iSubItem = 0;IvItem.pszText =;m_r2.InsertItem(&IvItem);m_r2.SetItemText(nIndex,0,tempj0);m_r2.SetItemText(nIndex,1,tempj1);m_r2.SetItemText(nIndex,2,tempj2);/R2学习R3的路由表for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;for(i = 0;i m_r3.GetItemCount();i+)tempi

18、0 = m_r3.GetItemText(i,0);tempi1 = m_r3.GetItemText(i,1);tempi2 = m_r3.GetItemText(i,2);i = 0;while(tempi1 != )k = atoi(tempi1.GetBuffer(0);k+;/距离加1tempi1.Format(%d,k);tempi2 = R3;/下一跳改为R1i+;for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r2.GetItemCount();i+)if (m_r2.GetItemTex

19、t(i,0) = tempj0)sign = 1;/表示有该网络if (m_r2.GetItemText(i,2) = tempj2)/若下一跳地址是X,则替换m_r2.SetItemText(i,1,tempj1);else/下一跳地址不是Xif (atoi(tempj1.GetBuffer(0) atoi(m_r2.GetItemText(i,1).GetBuffer(0)m_r2.SetItemText(i,1,tempj1);m_r2.SetItemText(i,2,tempj2);if (sign = 0)LV_ITEM IvItem;int nIndex = m_r2.GetIte

20、mCount();IvItem.mask = LVIF_TEXT;IvItem.iItem = nIndex;IvItem.iSubItem = 0;IvItem.pszText =;m_r2.InsertItem(&IvItem);m_r2.SetItemText(nIndex,0,tempj0);m_r2.SetItemText(nIndex,1,tempj1);m_r2.SetItemText(nIndex,2,tempj2);if (nIDEvent = 3)/R3学习R2的路由表for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;for(i =

21、0;i m_r2.GetItemCount();i+)tempi0 = m_r2.GetItemText(i,0);tempi1 = m_r2.GetItemText(i,1);tempi2 = m_r2.GetItemText(i,2);i = 0;while(tempi1 != )k = atoi(tempi1.GetBuffer(0);k+;/距离加1tempi1.Format(%d,k);tempi2 = R2;/下一跳改为R2i+;for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r3.GetIt

22、emCount();i+)if (m_r3.GetItemText(i,0) = tempj0)sign = 1;/表示有该网络if (m_r3.GetItemText(i,2) = tempj2)/若下一跳是X,则替换m_r3.SetItemText(i,1,tempj1);else/下一跳地址不是Xif (atoi(tempj1.GetBuffer(0) atoi(m_r3.GetItemText(i,1).GetBuffer(0)m_r3.SetItemText(i,1,tempj1);m_r3.SetItemText(i,2,tempj2);if (sign = 0)LV_ITEM I

23、vItem;int nIndex = m_r3.GetItemCount();IvItem.mask = LVIF_TEXT;IvItem.iItem = nIndex;IvItem.iSubItem = 0;IvItem.pszText =;m_r3.InsertItem(&IvItem);m_r3.SetItemText(nIndex,0,tempj0);m_r3.SetItemText(nIndex,1,tempj1);m_r3.SetItemText(nIndex,2,tempj2);SetTimer(1,5000,NULL);UpdateData(FALSE);/取消定时器if (m

24、_r1.GetItemCount() = 4 & m_r2.GetItemCount() = 4 & m_r3.GetItemCount() = 4)待添加的隐藏文字内容3KillTimer(1);KillTimer(2);KillTimer(3);MessageBox( 路由表已收敛!,);CDialog:OnTimer(nIDEvent);题目三:模拟P198滑动窗口的实现过程,要求接收端B有正常接受报文时,确认正确。不能收到所需要的报文时,重复发送确认报文。A端在连续收到3个重复确认时,启动重发机制。题目介绍:假定数据传输是按照一个方向进行传输的,即A发送数据,B给出确认,TCP的滑动窗

25、口是以字节为单位的。发送窗口表示:在没有收到B确认的情况下,A可以连续吧数据都发送出去,凡是已经发送的数据,在收到确认之前必须暂时保留,以便超时重传使用。发送窗口的后沿的后边部分表示发送已经收到了确认,这些数据不需要在保留了,发送窗口前沿的前面部分表示不允许发送的,因为接收方没有为这部分数据保留临时存放的缓存空间。发送窗口的大小由窗口的前沿和后沿共同决定。发送窗口的变化有两种可能,即不动(没有收到新的确认)和前移(收到新的确认),发送窗口的后沿不可能向后移动,因为不能撤销已经收到的确认,发送窗口的前沿通常是不断向前移动,但是也有可能不动,这两种情况一是没有收到新的确认,对方的通知窗口大小也不变

26、,二是收到了新的确认但是对方的窗口缩小了,使得发送的窗口前沿正好不动。发送窗口的前沿也有可能向后收缩,但是TCP的标准强烈不赞成这么做。算法说明:假设A为发送端,B为接收端,用链表保存发送但还没有接收的数据,A发送的数据先转存到链表中,每次发送插入到链表的末尾。B每次接收一个链表最前端的数据,接收后从链表首部删除该数据。分别用两个定时器控制发送和接收,发送和接收开始后一段时间,人为模拟一个传输错误,即删去链表最前端的数据。在界面上利用ListControl控件显示发送的数据和接收的数据,并且显示日志,控件显示的内容就是滑动窗口的位置。发送端每发送一个数据就在日志中显示“发送XX”,接收端每次接

27、受一个数据就在日志中显示“接收XX,ACK XX”,丢失数据以“XX 已经丢失”的形式显示在日志中。接收端每次返回的ACK值会存储在一个数组对应的元素中(初始值为0,每次ACK会让对应位置自加一次),发送端每次发送时会查询这个数组,若数组中有某个元素的值大于等于3(即连续三次没收到),则会重新发送这个数据。算法的流程图如下图所示:发送方发送数据接收方接收数据发送方检查ACK数组接收方接收数据,并传回相应ACK值有无值大于等于3N发送方按照正常顺序发送数据Y发送丢失的数据程序流程图:程序开始初始化控件开始发送接收数据接收端检测ACK数组按正常次序发送数据有无超过3次ACK发送丢失数据YN是否发送

28、完成NY程序结束运行截图: 主要代码实现:1. 计时器响应函数:void CMy03Dlg:OnTimer(UINT nIDEvent) int i,j,k;SLNode *p,*q;CString temp;CString temp2;LV_ITEM IvItem;int nIndex;if (nIDEvent = 1)int sign = 0;for (i = 0;i = 3)sign = 1;break;if (sign = 1)/表示收到三次确认 /*发送数据*/m_sendi1 = 1;/发送数据/添加到队列中p = head;while(p-next != NULL)p = p-n

29、ext;q = (SLNode *)malloc(sizeof(SLNode);q-date = m_sendi0;q-next = p-next;p-next = q;/修改日志nIndex = m_loglist.GetItemCount();IvItem.mask = LVIF_TEXT;IvItem.iItem = nIndex;IvItem.iSubItem = 0;IvItem.pszText =;temp.Format(%d,m_sendi0);m_ackm_sendi0 = -200;temp = A: 已经重新发送+temp;m_loglist.InsertItem(&IvI

30、tem);m_loglist.SetItemText(nIndex,0,temp); elsefor (i = 0;i 50;i+)if (m_sendi1 = 0)break;if (i next != NULL)p = p-next;q = (SLNode *)malloc(sizeof(SLNode);q-date = m_sendi0;q-next = p-next;p-next = q;nIndex = m_loglist.GetItemCount();IvItem.mask = LVIF_TEXT;IvItem.iItem = nIndex;IvItem.iSubItem = 0;

31、IvItem.pszText =;temp.Format(%d,m_sendi0);temp = A: 已经发送+temp;m_loglist.InsertItem(&IvItem);m_loglist.SetItemText(nIndex,0,temp);m_A.SetItemText(i-mark,1,);/控制删除列数if (nIDEvent = 2)p = head-next; /*接收数据*/m_rcvp-date1 = 1;m_B.SetItemText(p-date,1,);nIndex = m_loglist.GetItemCount();IvItem.mask = LVIF_TEXT;IvItem.iItem = nIndex;IvItem.iSubItem = 0;IvItem.pszText =;temp.Format(%d,p-date);for (j = 0;jnext = p-next;if (nIDEvent = 3)m_A.DeleteItem(0);mark+;CDialog:OnTimer(nIDEvent);总结:通过本次课程设计,对课本上的讲的知识有了更加形象的认识,熟悉了各题目知识点的深层次原理。而且,通过课程设计的练习,提高了自己编程的能力。在课程设计的过程中,力图让每个题目都做到符合要求,有欠缺的地方,以后会加强练习。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号