




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络 实 验 报 告 学生姓名 学 号 09091219 专业班级 计科12 指导教师 学 院 信息科学与工程学院 完成时间 2014年5月实验一 网络路由层协议模拟实验 【实验目的和要求】1. 掌握VB、VC+、VS或JAVA等集成开发环境编写路由仿真程序的方法;2. 理解并掌握距离向量路由协议和链路状态路由协议的工作原理。【实验内容】 模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。基本要求(动态生成网络拓扑图,节点间的距离随机生成。从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。观察和讨论多少轮交换后路由表稳定)【实验原理】 距离矢量路由算法”的基本思想如下:每个路由器维护一个距离矢量(通常是以延时是作变量的)表,然后通过相邻路由器之间的距离矢量通告进行距离矢量表的更新。每个距离矢量表项包括两部分:到达目的结点的最佳输出线路,和到达目的结点所需时间或距离,通信子网中的其它每个路由器在表中占据一个表项,并作为该表项的索引。每隔一段时间,路由器会向所有邻居结点发送它到每个目的结点的距离表,同时它也接收每个邻居结点发来的距离表。这样以此类推,经过一段时间后便可将网络中各路由器所获得的距离矢量信息在各路由器上统一起来,这样各路由器只需要查看这个距离矢量表就可以为不同来源分组找到一条最佳的路由。【编程语言和环境】1. Windows操作系统,编程语言C+2. 编程环境VC【实验具体设计实现及结果(含流程图及关键代码说明)】采用网络拓扑结构CDAGEFB93524581源代码:#include stdio.h#include stdlib.h#include conio.h /atoi的头文件#define ROUTNUM 7 /定义路由的个数为7个typedef structint dis; /存延迟大小int from; /存下一跳的路由RoutNode;RoutNode dataROUTNUMROUTNUM;/*路由表,能存7行7列数据,数据为权值*/void InitData(FILE* pfile);/*从数据文件读取数据,初始化路由表*/void OutputRoutData();/*输出所有的路由表*/void Communication(int recv, int send);/*send点向recv点发送自己的路由表*/void Exchange();/*所有节点进行一次数据交换, 更新路由表*/void main()int start, end, i, j;FILE *pfile;pfile = fopen(1.txt, r);if (pfile = NULL)printf(文件打开错误,按任意键退出.n);getch();return;elseprintf(n路由表初始:n);InitData(pfile);fclose(pfile);for (i = 0; iROUTNUM; i+)printf(%c|, i + 65);for (j = 0; j 0)printf( , j + 65, dataij.dis);printf(n); /显示各路由的路由表 for (i = 0; i ROUTNUM; i+) /循环7次(好像多余,改成一次得到同样结果)Exchange(); printf(n路由表交换:n);OutputRoutData();printf(输入起始路由节点数字(%d-%d)0代表A,1代表B. : , 0, ROUTNUM - 1);scanf(%d, &start);printf(输入终点路由节点数字(%d-%d)0代表A,1代表B. : , 0, ROUTNUM - 1);scanf(%d, &end);if (start = end | start 6 | end 6)printf(n输入错误,请按任意键退出n);getch();return;elseint cur = start;int total = 0;if (datastartend.dis , cur + 65);while (datacurend.from = 0) /起始点与终点不相连。0是Atotal += datacurdatacurend.from.dis; /total变成cur与下一跳的延迟printf(%c-, datacurend.from + 65);cur = datacurend.from; /起始路由变成下一跳 total += datacurend.dis;printf(%cn总的路由距离 = %d, end + 65, total);getch();return; void InitData(FILE *pfile)char num10;int i = 0;char c;int m, n;fseek(pfile, 0, 0); /文件指针从距0位置0距离开始读取for (m = 0; !feof(pfile) & m 7; m+) /feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m7循环.for (n = 0; !feof(pfile) & n = 0 & c = 9) | c = -) /*如果读到数字或符号.本题路由权值只能0到9*/numi+ = c; /*end of else if*/ /*end of while*/ /*end of for (n = 0*/ /*end of for (m = 0*/void OutputRoutData()int i, j;printf( );for (i = 0; i ROUTNUM; i+)printf( %c , i + 65);printf(n);for (i = 0; i ROUTNUM; i+)printf(%c , i + 65);for (j = 0; j ROUTNUM; j+)if (dataij.dis =10)printf( %d, dataij.dis);elseprintf( %d, dataij.dis);if (dataij.from 0)/如果未经过其它节点 所以直接相连的路由下一跳为-1printf( - );elseprintf( %c , dataij.from + 65); /输出下一跳路由 printf(n); void Communication(int recv, int send) /相连的两路由recv和send交换数据计算一次得到暂时最短距离int i;for (i = 0; i 0)/如果send节点到i号节点有路线if (datarecvi.dis datasendi.dis + datarecvsend.dis)/第二种recv与i相连,且直接相连值大于间接到i的延迟/如果现有路径比新路径远datarecvi.dis = datasendi.dis + datarecvsend.dis; /将recv到i的延迟改为间接延迟的值datarecvi.from = send; /下一跳改为send void Exchange() /实现所有相连的两路由进行数据交换并计算最短数值int i, j;for (i = 0; i ROUTNUM; i+)for (j = 0; j 0)/如果两个节点之间有路径Communication(j, i);/将i号节点的路由表发送给j号节点 /*1.text中存者路由信息0, 2,-1,-1, 8,-1, 5,2, 0,4, 5,-1,-1,-1,-1,4, 0,-1,-1, 9,-1,-1, 5,-1, 0,1,-1,-1,8,-1,-1,1, 0,-1, 7,-1,-1, 9,-1,-1, 0, 3,5,-1,-1,-1, 7, 3, 0,数值代表权值(如延迟大小)0代表目的网络到其本身-1代表无法直接相连 */【实验总结】 通过做模拟距离向量路由算法的路由表交换过程,使我更加深刻的了解了网络路由层的协议。距离矢量路由算法简单来说就是每个路由器维护一张表,表中给出了到每个目的路由器的已知最短“距离”和相应输出线路,并通过与相邻路由器交换距离信息来更新表由运行结果可知实验结果正确。起始点D下一跳为E到达G。其最短的距离为8.多次验证均正确。本实验的路由表由一个而为数组结构体实现,数组名代表两个相关路由,结构体中存放延时和下一跳。 路由表初始信息从文件读取,根据距离向量路由算法系统自动完成路由表的更新操作,最后任意输入两个路由表接点,则可得出两接点之间的最短路径。 距离矢量路由算法在理论中可以工作,但在实践中有一个严重的缺陷:虽然它总是能够达到正确的答案,但是它收敛到正确答案的速度非常慢,尤其是,它对于好消息的反应非常快,但是对于坏消息的反应非常迟缓。实验二Socket通信实验【实验目的和要求】3. 掌握VB、VC+、VS或JAVA等集成开发环境编写网络程序的方法;4. 掌握客户/服务器(C/S)应用的工作方式;5. 学习网络中进程之间通信的原理和实现方法;6. 理解单播、组播和广播的原理并比较其不同之处;7. 要求本机既是客户端又是服务器端;【实验内容】所编写的程序应具有如下功能:1. 具有点对点通信功能,任意客户端之间能够发送消息;2. 具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能收到;3. 具有广播功能,客户端能够向所有其他成员广播消息;【实验原理】实验原理:Socket即为网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一段成为一个socket。Socket通常用来实现客户端和服务端的连接。它既能接受请求,也能发送请求。在我选择使用java语言中,有专门的SocketServer类和Socket类来处理用户的请求和响应。网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。【编程语言和环境】3. 编程语言C+4. 编程环境Windows(VC)【实验具体设计实现及结果】服务器端客户端socketbindlistensocketconnectacceptrecvsendrecvclosesendclose阻塞自己等待客户连接请求数据应答数据1. 点对点通信功能实现网络点对点通讯程序的关键步骤就是实现信息在网络中的发送和接收。数据接收使用的是Socket,数据发送使用的是NetworkStream。1.1利用Socket来接收信息TcpListener tlListen1 = new TcpListener ( 8889 ) ; /侦听端口号 tlListen1.Start ( ) ; Socket skSocket = tlListen1.AcceptSocket ( ) ; /接受远程计算机的连接请求,并获得用以接收数据的Socket实例 EndPoint tempRemoteEP = skSocket.RemoteEndPoint ; /获得远程计算机对应的网络远程终结点 while ( true ) Byte byStream = new Byte80 ; /定义从远程计算机接收到数据存放的数据缓冲区 int i = skSocket.ReceiveFrom ( byStream , ref tempRemoteEP ) ; /接收数据,并存放到定义的缓冲区中 string sMessage = System.Text.Encoding.UTF8.GetString ( byStream ) ; /以指定的编码,从缓冲区中解析出内容 MessageBox.Show ( sMessage ) ; /显示传送来的数据 1.2利用NetworkStream来传送信息TcpClient tcpc = new TcpClient ( 13 , 8888 ) ; /对IP地址为“13”的计算机的8888端口提出连接申请 NetworkStream tcpStream = tcpc.GetStream ( ) ; /如果连接申请建立,则获得用以传送数据的数据流string sMsg = 您好,见到您很高兴 ; StreamWriter reqStreamW = new StreamWriter ( tcpStream ) ; /以特定的编码往向数据流中写入数据 ,默认为UTF8编码 reqStreamW.Write ( sMsg ) ; /将字符串写入数据流中 reqStreamW.Flush ( ) ; /清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流2. 群组通信功能组播编程需要UDP,有两个类支持组播网络编程Socket和UdpClient.一台计算机要加入某一个组,然后接收发往这个组的信息。Socket类要调用SetSocketOption函数加入和离开某一个组。UdpClient类有直接的加入和离开某个组的成员函数可以调用。而向某个组发信息,则没有什么特殊的,只需把发送数据的目的地址设为组播地址就可以了。发送端: Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(), 3000); EndPoint ep = (EndPoint)iep;byte b = Encoding.ASCII.GetBytes(just a test!); s.SendTo(b, ep); s.Close();接收端: Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 3000); EndPoint ep=(EndPoint)iep; s.Bind(iep); s.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.AddMembership,new MulticastOption(IPAddress.Parse(); byteb=new byte1024; s.ReceiveFrom(b,ref ep); string test; test = System.Text.Encoding.ASCII.GetString(b); Console.WriteLine(test); s.Close(); Console.ReadKey();3. 广播功能此功能和组播功能实现类似,只要在发送端获得子网中IP广播地址发送休息即可。/ 广播模式(自动获得子网中的IP广播地址) broadcastIpEndPoint = new IPEndPoint(IPAddress.Broadcast, 3000);【实验结果】【实验总结】此次实验是对Socket的一个应用,让我更深的了解了Socket函数的作用及使用方法。实验过程中遇到了很多的问题,例如:程序只能通信一次。刚开始我以为建立的socket套接口只要建立一次并更新连接地址就可以多次使用。当初不知道问题存在的在于这,在程序加入很多错误报告代码,发现再客户端再次connect的时候返回负值。在网上查看很多相关代码之后,发现问题所在,把建立socket的代码写进客户端的循环体中,每次通信都重新建立socket套接口就可以。Socket搭建基本步骤:1、 创建socket;2、阻塞等待客户端连接;3、客户端连接之后获取输入输出流,按照协议对客户端进行读写;4、关闭socket。客户端连接的基本步骤也是一样的,即:1、创建客户端,连上相应的服务器;2、连上之后获取输入输出流,按照协议进行读写操作;3、关闭客户端。通过本次实验能够感受到网络在实际当中的运用,使我对网络编程有了更深的概念。同时让我发现自己知识结构的欠缺。比如群组通信功能和广播功能难以实现,需要我查阅大量的资料才能有所头绪。源代码:服务器端/#include stdafx.h 服务器端#include#include #include #include #include #include #include #include #include #pragma comment(lib,ws2_32.lib) #define MYPORT 3490 /*定义用户连接端口*/ #define BACKLOG 10 /*多少等待连接控制*/ #define SERVER_IP_ADDR 1 /*服务器的IP地址*/ int _tmain(int argc, _TCHAR* argv) SOCKET sock, msgsock; int length = 0; struct sockaddr_in server; struct sockaddr tcpaddr; char buf1024 = ; int rval= 0, len= 0, err = 0; WORD wVersionRequested; WSADATA wsaData; /*指定socket版本,否则创建socket失败,即使创建socket返回值不为-1,但是bind时会失败*/ wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return -1; /* 建立套接字*/ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock 0) perror(opening stream socket); exit(1); /* 使用任意端口命名套接字*/ server.sin_family = AF_INET; server.sin_port = htons(MYPORT); server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDR); memset(server.sin_zero, 0, sizeof(server.sin_zero); /将服务器地址与socket绑定在一起 rval = bind(sock, (struct sockaddr *)&server, sizeof(server); if (rval 0) perror(binding stream socket); exit(1); / 找出指定的端口号并打印出来 length = sizeof(server); if (getsockname(sock, (struct sockaddr *)&server, &length) 0) perror(getting socket name); exit(1); printf(socket port #%dn, ntohs(server.sin_port); / 开始接收连接,最大请求数为 listen(sock, 5); len = sizeof(struct sockaddr); do msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len); if (msgsock = -1) perror(accept); else memset(buf, 0, sizeof(buf); if ( (rval = recv(msgsock, buf, sizeof(buf),0) %sn, buf); closesocket(msgsock); while(1); closesocket(msgsock);r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨文化健康行为差异-洞察及研究
- 浙江省2025-2026学年七年级语文上学期第一次月考复习试卷(含答案)
- 数据存储系统的分布式设计与优化方法-洞察及研究
- 部门安全生产培训制度课件
- 部门二级安全培训时长课件
- 避坑房产课件
- 基于循环经济的刮板链废旧部件资源化利用路径探索
- 基于元宇宙技术的虚拟现场重建与跨时空图像传输溯源研究
- 基于AI图像识别的动态分级系统与农业物联网集成瓶颈
- 国际标准对接中国产产床核心部件的供应链韧性研究
- 浙江省温州市名校2025届英语八下期末教学质量检测试题含答案
- 2025至2030中国森林防火行业现状供需分析及重点企业投资评估规划分析报告
- 2025至2030中国多圈绝对旋转编码器行业项目调研及市场前景预测评估报告
- 译林版六年级上册公开课Unit-3holiday-fun(story-time)教案课件原创
- JG/T 336-2011混凝土结构修复用聚合物水泥砂浆
- 供暖电工面试题及答案
- 2024-2025初中七年级历史上册各单元知识点总结
- 卫生院岗位体系与职责说明
- 基于多维度视角的广西有色金属产业技术创新能力评价与提升路径研究
- 关于工资结清协议书
- 养老机构供餐协议书
评论
0/150
提交评论