计算机网络实验报告.docx
- 文档编号:24624951
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:17
- 大小:86.68KB
计算机网络实验报告.docx
《计算机网络实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
计算机网络实验报告
计算机网络
实验报告
目录
实验一Socket通信实验3
【实验目的和要求】3
【实验内容与实现原理】3
实验内容:
3
实现原理:
4
【实验具体设计实现及结果】4
实验流程图:
4
实验主要函数说明:
4
源代码:
5
实验结果:
6
【实验设备与实验环境】6
【实验总结】7
实验二网络路由层协议模拟实验7
【实验目的和要求】7
【实验内容与实现原理】7
实验内容:
7
实现原理:
8
【实验具体设计实现及结果】8
网络拓扑结构:
8
源代码:
9
实验结果:
13
【实验设备与实验环境】14
【实验总结】14
实验一Socket通信实验
网络编程是通过使用套接字来达到进程间通信目的的编程,Socket编程是网络编程的主流工具,SocketAPI是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制,提供了访问下层通信协议的大量系统调用和相应的数据结构。
本实验利用SocketAPI编写网络通信程序,具体实验要求及内容如下。
【实验目的和要求】
1.掌握C++、JAVA或Python等集成开发环境编写网络程序的方法;
2.掌握客户/服务器(C/S)应用的工作方式;
3.学习网络中进程之间通信的原理和实现方法;
4.要求本机既是客户端又是服务器端;
【实验内容与实现原理】
实验内容:
编写一个端口扫描器(类似nmap的简易版本)。
给定目的ip地址,可以扫描目的IP地址在哪个端口上可以接受tcp连接和udp连接。
实现原理:
建立一个socket,依次然后连接到远程主机的该端口。
如果成功,则可以判断该端口打开.
【实验具体设计实现及结果】
实验流程图:
创建套接字
连接服务器
链接失败:
说明端口没打开,显示端口未打开提示
连接成功:
说明端口打开,显示端口打开提示
实验主要函数说明:
函数原型:
intsocket(int domain,int type,int protocol);
参数说明:
domain:
协议域,又称协议族(family)。
常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域Socket)、AF_ROUTE等。
协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
type:
指定Socket类型。
常用的socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。
流式Socket(SOCK_STREAM)是一种面向连接的Socket,针对于面向连接的TCP服务应用。
数据报式Socket(SOCK_DGRAM)是一种无连接的Socket,对应于无连接的UDP服务应用。
protocol:
指定协议。
常用协议有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
源代码:
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;
intmain()
{
//初始化WindowsSockets动态库
WSADATAwsaData;
//WSADATA,一种分子结构。
这个结构被用来存储被WSAStartup函数调用后返回的WindowsSockets数据。
它包含Winsock.dll执行的数据。
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{
cout<<"找不到可使用的WinSockdll!
"< return1; } SOCKETsClient=NULL; SOCKADDR_INaddrServ; addrServ.sin_family=AF_INET; //sin_family指代协议族,在socket编程中只能是AF_INET addrServ.sin_addr.S_un.S_addr=inet_addr("192.168.0.101"); //s_addr按照网络字节顺序存储IP地址 for(int_port=0;_port<100;_port++) { if(sClient==NULL) { //创建套接字 sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(sClient==INVALID_SOCKET) { cout<<"创建客户端socket失败! "< return1; } } addrServ.sin_port=htons(_port); //连接服务器 if(connect(sClient,(sockaddr*)&addrServ,sizeof(sockaddr))==SOCKET_ERROR) { cout<<"port"<<_port<<"isnotopen! "< } else { cout<<"port"<<_port<<"openonhost! "< closesocket(sClient); sClient=NULL; } } //关闭套接字,释放资源 getchar(); WSACleanup(); return0; } 实验结果: 【实验设备与实验环境】 实验设备: 个人pc电脑 实验环境: 科技楼四楼计算机实验室 编程语言: C++ 编程环境: Windows 【实验总结】 在本次实验中,我收获了许多。 首先第一次接触计算机网络编程,对于没有经验的我来说一开始无从下手,后来经过认真阅读课本和查阅资料,我有了解决该问题的思路,建立一个socket,依次然后连接到远程主机的该端口。 如果成功,则可以判断该端口打开。 确定了思路之后,还要对socket函数进行一个详细的了解后才能完成编程。 在本次实验过后,我不仅在知识上有了收获,在实验的完成历程中也有所成长。 实验二网络路由层协议模拟实验 网络路由算法是路由器工作的核心,本实验针对因特网常用的距离向量路由算法和链路状态路由算法进行模拟实现,进一步掌握其工作原理及其相关性能。 【实验目的和要求】 1.掌握VB、VC++、VS或JAVA等集成开发环境编写路由仿真程序的方法; 2.理解并掌握距离向量路由协议和链路状态路由协议的工作原理。 【实验内容与实现原理】 实验内容: 模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。 基本要求(动态生成网络拓扑图,节点间的距离随机生成。 从初始路由表开始,进行交换路由表,演示每轮交换后的路由表的变化。 观察和讨论多少轮交换后路由表稳定) 实现原理: 距离向量路由算法(Bellman-FordRoutingAlgorithm),作为距离向量协议的一个算法,如RIP,(RIP跳最大跳数16)BGP。 使用这个算法的路由器必须掌握这个距离表,它告诉在网络中每个节点的最远和最近距离。 在距离表中的这个信息是根据临近接点信息的改变而时时更新的。 这个在算法中的度量公式是跳跃的次数,等待时间,流出数据包的数量等等。 概括地说,距离向量算法要求每一个路由器把它的整个路由表发送给与它直接连接的其它路由器。 路由表中的每一条记录都包括目标逻辑地址、相应的网络接口和该条路由的向量距离。 当一个路由器从它的相邻处收到更新信息时,它会将更新信息与本身的路由表相比较。 如果该路由器比较出一条新路由或是找到一条比当前路由更好的路由时,它会对路由表进行更新: 将从该路由器到邻居之间的向量距离与更新信息中的向量距离相加作为新路由的向量距离。 在距离向量路由算法中,相邻路由器之间周期性地相互交换各自的路由表备份。 当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。 距离矢量路由算法在理论中可以工作,但在实践中有一个严重的缺陷: 虽然它总是能够达到正确的答案,但是它收敛到正确答案的速度非常慢,尤其是,它对于好消息的反应非常快,但是对于坏消息的反应非常迟缓。 【实验具体设计实现及结果】 网络拓扑结构: 源代码: #include"stdio.h" #include"stdlib.h"//atoi的头文件 //#include"alloc.h" #defineROUTNUM7//定义路由的个数为7个 typedefstruct { intdis;//存延迟大小 intfrom;//存下一跳的路由 }RoutNode; RoutNodedata[ROUTNUM][ROUTNUM];/*路由表,能存7行7列数据,数据为权值*/ voidInitData(FILE*pfile);/*从数据文件读取数据,初始化路由表*/ voidOutputRoutData();/*输出所有的路由表*/ voidCommunication(intrecv,intsend);/*send点向recv点发送自己的路由表*/ voidExchange();/*所有节点进行一次数据交换,更新路由表*/ voidmain() { intstart,end,i,j; FILE*pfile; pfile=fopen("1.txt","r"); if(pfile==NULL) { printf("文件打开错误,按任意键退出.\n"); return; } else printf("\n路由表初始: \n"); InitData(pfile); fclose(pfile); for(i=0;i { printf("%c||",i+65); for(j=0;j if(data[i][j].dis>0) printf("<%c%d>",j+65,data[i][j].dis); printf("\n"); }//显示各路由的路由表 for(i=0;i { 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<0||start>6||end<0||end>6) { printf("\n输入错误,请按任意键退出\n"); return; } else { intcur=start; inttotal=0; if(data[start][end].dis<0) { printf("没有路由路径发现! \n"); return; } printf("%c->",cur+65); while(data[cur][end].from>=0)//起始点与终点不相连。 0是A { total+=data[cur][data[cur][end].from].dis;//total变成cur与下一跳的延迟 printf("%c->",data[cur][end].from+65); cur=data[cur][end].from;//起始路由变成下一跳 } total+=data[cur][end].dis; printf("%c\n总的路由距离=%d",end+65,total); system("pause"); return; } } voidInitData(FILE*pfile) { charnum[10]; inti=0; charc; intm,n; fseek(pfile,0,0);//文件指针从距0位置0距离开始读取 for(m=0;! feof(pfile)&&m<7;m++)//feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m<7循环. { for(n=0;! feof(pfile)&&n<7;n++) { while(! feof(pfile)) { c=fgetc(pfile);//读取单个字节 if(c==',')/*读完一个数字*/ { num[i]='\0';//赋值为空 data[m][n].dis=atoi(num);//atoi将字符变成数字,将路由权值给data[][].dis data[m][n].from=-1;//直接相连下一跳全都赋值为-1 i=0; break; }/*endofif*/ elseif((c>='0'&&c<='9')||c=='-')/*如果读到数字或符号.本题路由权值只能0到9*/ { num[i++]=c; }/*endofelseif*/ }/*endofwhile*/ }/*endoffor(n=0*/ }/*endoffor(m=0*/ } voidOutputRoutData() { inti,j; printf(""); for(i=0;i { printf("%c",i+65); } printf("\n"); for(i=0;i { printf("%c",i+65); for(j=0;j { if(data[i][j].dis<0)//如果无路径 printf("-"); else if(data[i][j].dis>=10) printf("%d",data[i][j].dis); else printf("%d",data[i][j].dis); if(data[i][j].from<0)//如果未经过其它节点所以直接相连的路由下一跳为-1 printf("-"); else printf("%c",data[i][j].from+65);//输出下一跳路由 } printf("\n"); } } voidCommunication(intrecv,intsend)//相连的两路由recv和send交换数据计算一次得到暂时最短距离 { inti; for(i=0;i { if(data[send][i].dis>0)//如果send节点到i号节点有路线 { if(data[recv][i].dis<0)//如果recv到i号节点无路径 { data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//第一种recv不予i相连,recv到不与他相连的i的延迟 data[recv][i].from=send;//下一跳为send } elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//第二种recv与i相连,且直接相连值大于间接到i的延迟 //如果现有路径比新路径远 { data[recv][i].dis=data[send][i].dis+data[recv][send].dis;//将recv到i的延迟改为间接延迟的值 data[recv][i].from=send;//下一跳改为send } } } } voidExchange()//实现所有相连的两路由进行数据交换并计算最短数值 { inti,j; for(i=0;i { for(j=0;j { if(data[i][j].dis>0)//如果两个节点之间有路径 { Communication(j,i);//将i号节点的路由表发送给j号节点 } } } } 实验结果: 【实验设备与实验环境】 实验设备: 个人pc电脑 实验环境: 科技楼四楼计算机实验室 编程语言: C++ 编程环境: Windows 【实验总结】 本实验的过程比较顺利,网络的拓扑图是采用邻接矩阵存储,因为网络拓扑一般比较稠密。 实验结果很正确,可以快速得到所有路由的最优路由表。 通过本次试验,我加深了对距离向量路由算法的理解,同时也锻炼了编程技术。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 实验 报告