计算机网络原理实验三 云南大学

合集下载

云南大学 软件学院 计算机网络原理试卷

云南大学  软件学院    计算机网络原理试卷

一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四2.计算机网络中可以共享的资源包括()A、硬件、软件、数据、通信信道B、主机、外设、软件、通信信道C、硬件、程序、数据、通信信道D、主机、程序、数据、通信信道3.网络协议主要要素为()A、数据格式、编码、信号电平B、数据格式、控制信息、速度匹配C、语法、语义、同步D、编码、控制信息、同步4.采用专用线路通信时,可以省去的通信阶段是()A、建立通信线路B、建立数据传输链路C、传送通信控制信号和数据D、双方确认通信结束5.通信系统必须具备的三个基本要素是()A、终端、电缆、计算机B、信号发生器、通信线路、信号接收设备C、信源、通信媒体、信宿D、终端、通信设施、接收设备6.宽带传输通常使用的速率为()A0-10Mbit/sB1-2.5Mbit/sC5-10Mbit/s D、0-400Mbit/s7.计算机网络通信系统是()A、电信号传输系统B、文字通信系统C、信号通信系统D、数据通信系统8.网络接口卡的基本功能包括:数据转换、通信服务和()A、数据传输B、数据缓存C、数据服务D、数据共享9.完成通信线路的设置与拆除的通信设备是()A、线路控制器B、调制解调器C、通信控制器D、多路复用器10.在星型局域网结构中,连接文件服务器与工作站的设备是()A、调制解调器B、交换器C、路由器D、集线器11.在OSI七层结构模型中,处于数据链路层与运输层之间的是()A、物理层B、网络层C、会话层D、表示层12.完成路径选择功能是在OSI模型的()A、物理层B、数据链路层C、网络层D、运输层13.下列功能中,属于表示层提供的是()A、交互管理B透明传输C、死锁处理D、文本压缩14.在TCP/IP协议簇的层次中,解决计算机之间通信问题是在()A、网络接口层B、网际层C、传输层D、应用层15.对局域网来说,网络控制的核心是()A、工作站B网卡C、网络服务器D、网络互连设备16.在中继系统中,中继器处于()A、物理层B、数据链路层C、网络层D、高层17.各种网络在物理层互连时要求()A、数据传输率和链路协议都相同B、数据传输率相同,链路协议可不同C、数据传输率可不同,链路协议相同D、数据传输率和链路协议都可不同18.网络管理系统中,管理对象是指()A、网络系统中各种具体设备B、网络系统中各种具体软件C、网络系统中各类管理人员D、网络系统中具体可以操作的数据19.Intranet技术主要由一系列的组件和技术构成,Intranet的网络协议核心是()A、ISP/SPX B、P PP C、TCP/IP D、SLIP20.网络管理信息系统的分析设计以()A、功能模块设计为中心B、数据分析为中心C、系统拓扑结构设计为中心D、系统规模分析为中心计算机网络技术期末复习试卷一、填空题(0.5%×30)1.传送信号的一条通道叫____信道________。

云南大学软件学院计算机网络原理报告4

云南大学软件学院计算机网络原理报告4

云南大学软件学院实验报告课程:计算机网络原理实验任课教师:刘春花,刘宇姓名: ____ 学号:__________专业:数字媒体技术成绩:实验四、web服务器套接字编程实验报告1.实验目的:编写一个WEB服务器程序,可以接受来自浏览器的访问,并传输页面(包含多个对象)到浏览器。

掌握Socket编程。

2.实验环境:连入局域网络的主机一台。

3.实验指导:超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一。

HTTP协议是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

一个完整的HTTP协议会话过程包括四个步骤:✧连接Web浏览器与Web服务器建立连接,打开一个称为Socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功;✧请求Web浏览器通过Socket向Web服务器提交请求。

HTTP的请求一般是GET或POST 命令(POST用于FORM参数的传递);✧应答Web浏览器提交请求后,通过HTTP协议传送给Web服务器。

Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面;✧关闭连接应答结束后Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web 服务器建立连接。

4.实验分析,回答下列问题。

运行实验提供的Webserver.java程序,分析该程序实现的功能,为实验程序主要代码加上注释。

import java.io.*;import .*;import java.util.*;class Webserver{public static void main(String arg[]) throws Exception{//变量定义String requestMessageLine;String filename;ServerSocket listenSocket=new ServerSocket(8080);//创建一个ServerSocket套接字对象,并绑定在8080端口上Socket connectionSocket=listenSocket.accept();//监听并接受客户端BufferedReaderinFromClient=newBufferedReader(newInputStreamReader(connectionSocket.getInputStream()));//根据socket输入流,创建个缓冲读取的对象DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());//根据socket输入流,创建个数据输出流,返回客户端的requestMessageLine=inFromClient.readLine();//读取第一行信息StringTokenizer tokenizerLine=new StringTokenizer(requestMessageLine);//将第一行信息转换成StringTokenizer对象if(tokenizerLine.nextToken().equals("GET")){ //如果遇到"GET"filename=tokenizerLine.nextToken();//将下一个值赋值给filenameif(filename.startsWith("/")==true)filename=filename.substring(1); //如果filename中有/,去掉/System.out.println("The request filename is:" + filename);//打印出The request filename is:File file=new File(filename);int numOfBytes=(int)file.length();//获得到这个文件的大小FileInputStream inFile=new FileInputStream(filename);//创建这个文件的输入流byte[] fileInBytes=new byte[numOfBytes]; //定义个文件大小的字节数组inFile.read(fileInBytes); //将文件读入到字节数组中outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n"); //将字符返回给客户端if (filename.endsWith(".jpg")) //如果文件是jpg格式的outToClient.writeBytes("Content-Type:image/jpeg\r\n"); //将文件类型jpeg发送给客户端if (filename.endsWith(".gif")) //如果文件是gif格式的outToClient.writeBytes("Content-Type:image/gif\r\n"); //将文件类型gif发送给客户端outToClient.writeBytes("Content-Length:" + numOfBytes + "\r\n"); //将文件大小发送给客户端outToClient.writeBytes("\r\n"); //换行outToClient.write(fileInBytes, 0, numOfBytes); //将文件的字节流形式发送给客户端connectionSocket.close(); //关闭socket} elseSystem.out.println("Bad Resquest Message"); //如果请求信息中没有“GET”,控制台输出此信息}}运行截图如下:5、实验总结总结你在实验过程中遇到的问题和解决的方法。

云南大学软件学院计算机网络原理实验五和六-17年金老师班

云南大学软件学院计算机网络原理实验五和六-17年金老师班

实验五、六传输层协议分析实验报告序号:姓名:学号:2016 成绩1.实验目的:理解TCP报文首部格式和字段的作用,TCP连接的建立和释放过程,TCP数据传输过程中编号与确认的过程;分析UDP协议报文格式。

2.实验环境:连网环境,可以是局域网,也可以是连入Internet的单机。

3.实验步骤:(1)启动Etherel协议分析软件,并开始抓包。

(2)启动某个基于TCP的应用程序,例如连接某个FTP站点,或通过浏览器访问某个网页。

(3)等出现浏览的网页后停止数据包的捕获。

(4)出现协议分析界面,将filter 一栏填入tcp,则只显示TCP协议信息,通过此信息,可以看到TCP连接的三次握手过程和协商的初始的序列号,数据传输过程以及拆除连接的相应信息。

4.实验分析,回答下列问题实验五 TCP协议分析打开捕获文件,通过捕获的数据包分析TCP建立连接的三次握手的过程,并将TCP建立连接过程中的三个报文填写下来。

字段名称第一条报文第二条报文第三条报文报文序号 1 2 3Sequence Number 0 0 1 Acknowedgement Numbber 0 1 1ACK 0 1 1SYN 1 1 0(1)TCP建立连接时的三个报文,其报文首部与其他TCP报文有什么不同?都使用了SYN 协议。

TCP 建立连接时的三个报文的首部都具有Options 字段,且其Sequence 和Acknowedgement Numbber为0或者1。

SYN是发送标志位,ACK是确认标志位。

(2)报文首部的OPTION字段的作用是什么?值为多少?表明本端所能接收的最大长度的报文段。

值为12bytes。

(3)分析TCP数据传输阶段的前8个报文,将报文信息填入到表中数据传送阶段第一个报文的序号字段值是否等于连接建立时第三个报文的序号?相等(4)捕获一个拆除TCP连接的数据包,附上捕获截图,主要要包含拆除连接的数据包部分,分析TCP释放连接的过程,选择TCP释放连接过程当中的四个报文,将报文信息填在下表。

云南大学软件学院计算机网络原理实验八

云南大学软件学院计算机网络原理实验八

实验八、链路层实验——基于CRC编码的检错程序的实现一、实验目的1、通过实验,掌握CRC编码和解码的原理。

2、掌握基于CRC编码的差错检测技术。

二、实验指导现在计算机网络广泛采用的差错检测技术是基于CRC(cyclic redundancy check)循环冗余检测编码,CRC也称为多项式编码(polynomial code),CRC算法非常容易用硬件实现。

CRC编码操作如下:对给定的数据D,发送者选择r个附加位,追加到D的末尾,形成d+r位的新位型,该位型正好能被G模2除尽。

其中,G称为生成器。

CRC编码算法实现:1、选择生成多项式G,其最高次方为r,即r+1位的二进制位串2、计算D·2r, 即在数据D后面补r个0,构成d+r位的位串3、按模2除法求(D·2r/G)的余数R4、从D·2r中模2加上R,得到新的数据T,即加了CRC的帧三、实验要求1、设置一个d位的数据D,r+1位的多项式G,生成CRC码,并把此CRC码作为数据帧进行传送。

2、编写两个子程序,分别实现CRC编码和CRC解码,在主函数中对子程序进行调用。

解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。

3、要求分别以正确和错误的数据来检验此检错程序。

4、将编写程序的源代码加必要注释和程序运行结果一起填入实验报告中。

提示:1、编写程序时数据直接用二进制数,可能用到位操作符^(异或)和<<(左移)。

2、在设置错误的编码时,错误位数最好不要超过r+1位。

四、程序代码#include <stdlib.h>void crc_code(int A[],int G[],int x,int n)//编码子程序,异或函数,求余数{int i,j,k;printf("\n\t\t");printf("%d",A[k]);//输出补零以后的数for(i=0;i<=x-n+1;i++){if(A[i]==1)//当首位为1时进行异或{for(j=0;j<=n-1;j++){if(A[i+j]==G[j])A[i+j]=0;//异或运算,相同为0,不同为1elseA[i+j]=1;}printf("\n\t\t");//输出每次异或运算后的结果for(k=0;k<=x-1;k++)printf("%d",A[k]);//输出余数}}}void crc_decode(int M[],int A[],int m,int n)//检验解码子程序{int i,sign=0;//初始化,定义一个标志位signfor(i=0;i<=m-1;i++){if(M[i]!=A[i])//若输入的M[i]中的任意一位不等于对应的A[i]{printf("第%d位出现错误\n",i+1);//输出错误信息sign=1;//若不等,则置标志位为1}}if(sign!=1)printf("数据正确\n");//输出正确信息}int main(){int m,n;int A[20],M[20],G[20],i,j;printf("请输入M[x]的长度m= ");scanf("%d",&m);printf("请输入G[x]的长度n= ");scanf("%d",&n);printf("\n请输入M[x]= \n");scanf("%d",&M[i]);printf("\n请输入G[x]= \n");for(j=0;j<=n-1;j++)scanf("%d",&G[j]);for(i=0;i<=m-1;i++)A[i]=M[i];for(i=m;i<=m+n-2;i++)A[i]=0;//被除数左移r位,r=m+n-2,即补r个0 crc_code(A,G,m+n-1,n);//调用异或运算函数for(i=0;i<=m-1;i++)A[i]=A[i]+M[i];//在被除数后面加上余数printf("\n\n结果为: ");for(i=0;i<=m+n-2;i++)printf("%d",A[i]);printf("\n");printf("\n请输入要进行CRC解码的数据:\n");for(i=0;i<=m-1;i++)scanf("%d",&M[i]);crc_decode(M,A,m,n);//调用校验解码函数return 0;}五、运行结果六、实验小结①通过这个实验,对CRC编码解码的算法有了初步了解.并且学会了CRC编码解码的算法。

云南大学--软件学院--计算机网络原理-期末试题复习总结

云南大学--软件学院--计算机网络原理-期末试题复习总结

注意:这是04-05学期王老师出的试题。

1.Ethernet使用的MAC协议是(1)。

当发生冲突时,将进入二进制指数退避阶段,对于第3次冲突,等待重传的最长时间是512位时间的(2)倍。

(1)A.ALOHA B.CSMA/CD C.CSMA/CA D.CSMA/DD (2)A.1 B.3C.5 D.72.网络体系结构定义计算机网络的分层结构,TCP/IP模型和ISO/OSI参考模型是两个主要的网络模型,其中TCP/IP协议传送层之上的层是(3)层,而ISO/OSI 则是一个(4)层的模型。

(3)A.应用B.表述C.会话D.网络(4)A.4 B.5 C.6 D.73.传统的以太网传输介质是同轴电缆,其中使用粗同轴电缆的网络称为(5)网络,使用细同轴电缆的网络称为(6)网络。

10Base-T网络使用的传输介质是无屏蔽双绞线,简称为(7)。

(5)A.5BASE B.10BASE-10 C.10BASE-5D.10BASE-2 (6)A.5BASE B.10BASE-10 C.10BASE-5 D.10BASE-2(7)A.UPT B.UTP C.UPP D.UUP 4.有N个节点共享一条总传输速率为R的通信信道,若采用TDMA协议,则每个节点的平均传输速率是(8),而瞬时传输速率则为(9);如果采用FDMA 协议,则每个节点的平均传输为(10),而瞬时传输速率则为(11)。

(8)A.R B.R/N C.NR D.2R(9)A.R B.R/N C.NR D.2R(10)A.R B.R/N C.NR D.2R(11)A.R B.R/N C.NR D.2R5.可靠传输协议rdt3.0的发送和接收窗口都是1,对其进行改进后的GBN协议和SR协议都把发送窗口尺寸扩大为N(>1)。

但GBN协议的接收窗口为(12),而SR协议的接收窗口为(13)。

对SR协议,若使用k位的序号,则其发送窗口尺寸应(14)。

(12)A.1 B.N/4 C.N/2 D.N(13)A.1 B.N/4 C.N/2 D.N(14)A.不大于2k B.等于2k C.不大于2k-1D.等于2k-16.PPP协议可以用在(15)链路上,并使用(16)协议完成链路状态的管理,使用(17)协议完成网络层地址配置和压缩方式协商。

云南大学2011至2012学年下学期软件学院2010级《高级计算机网络原理》期中考试(闭卷)试卷(答案)

云南大学2011至2012学年下学期软件学院2010级《高级计算机网络原理》期中考试(闭卷)试卷(答案)

云南大学2011至2012学年下学期软件学院2010级《高级计算机网络原理》期中考试(闭卷)答案第一题答题卡题号(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) 答案A/D A B C A D C D B A第二题答题卡题号(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)答案×××××√××√×三、问答题(5小题,每小题5分,共25分)1. What is the difference between a group-shared tree and a source-based tree in the context of multicastrouting?要点:对于基于源的树,每个源所使用的树都不同;对于组共享树,所有源都使用相同的树。

2. What are the roles palyed by the IGMP protocol?要点:运行在路由器及连接的主机之间,为有应用要加入特定多点组的主机提供通知路由器的一种方法。

3. RTCP defined three packet types: receiver report packet, sender report packet and source descriptionpacket.Please summarize the information contained in each of these packet type briefly.要点:receiver report packet——包丢失率、平均时延抖动、最后包序号;sender report packet ——RTP流的SSRC、当前时间、发送的包数量、发送的字节数;source description packet——发送者的邮件地址、名字、与RTP流相关的SSRC。

昆明理工大学(计算机网络)实验报告

昆明理工大学(计算机网络)实验报告

昆明理工大学(计算机网络)实验报告实验名称实验六熟悉ftp指令
实验时间 2010 年 6 月 2 日
专业班级教师评语:
姓名
学号成绩教师签名李劲一、实验目的
了解并学会使用ftp的10个基本指令
二、实验内容及步骤
Get 从远端主机中传送至本地主机中
Mget 从远端主机接收一批文件至本地主机
Put 将本地一个文件传送至远端主机中
Mput 将本地主机中一批文件传送至远端主机
Del 删除远端主机中的文件
Dir 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件.
Mdelete 删除一批文件
pwd: 列出当前远端主机目录
cd:切换目录;
假设要上传文件hanzj2.txt至服务器\d目录中
lcd: 改变当前本地主机的工作目录
,如果缺省,就转到当前用户的HOME目录
三.实验总结
通过实验对FTP有了更深的了解,会使用其十个基本指令。

山大三七作业——计算机网络原理(04741)

山大三七作业——计算机网络原理(04741)

实验一双绞线的制作实验二 TCP/IIP协议配置(2) ping在命令行下键入:Ping 127.0.0.1,显示以下信息:物理地址动态IP是否可用机Ip地址子码掩网网关域名服务器IP地址节点型节点类型主机名DNS后缀机节点类型IP路由器是否可用名节点型节点类型在命令行下键入:Ping 本机IP地址,显示信息如下:说明网络配置正确。

●Ping 202.117.200.200,输出信息为:说明网络配置不正确,连接不成功。

2.查看所在机器的主机名称和网络参数,了解网络基本配置中包含的协议、服务和基本参数。

●查看本机主机名称和工作组本机主机名称和工作组名称如图1。

查看本机网络配置参数“本地连接属性”窗口如图2。

“Internet协议(TCP/IP)”属性窗口如图3。

3.共享资源设置在本机上选择了文件夹设置文件夹共享,共享属性为只读。

在本机上选择了文件夹设置文件夹共享,共享属性为可改写。

4. 共享资源访问在邻居查看了计算机 55 ,访问了共享文件夹,进行了拷贝文件、删除文件、改名等,能够顺利完成,说明该文件夹是可改写的。

在邻居查看了计算机 55 ,访问了共享文件夹,进行了拷贝文件、删除文件、改名等,不能顺利完成,说明该文件夹是只读。

5.修改网络配置参数,建立小组内的局域网●修改本机所属工作组工作组名原为 CIE1N ,修改为土木。

●修改本机网络配置参数:修改的本机网络配置参数为:实验三 WEB服务器配置步骤二,出现如下图组件安装向导,选择“Intnetnet信息服务(IIS)”,单击“下一步”开始安装,单击“完成”结束。

注意:系统自动安装组件,完成安装后,系统在“开始/程序/管理工具”程序组中会添加一项”Internet服务管理器”,此时服务器的www.FTP等服务会自动启动。

系统只有在安装了IIS后,IIS5.0才会自动默认安装。

www服务器的配置和管理选择“开始/程序/管理工具/Internet选项”窗口,窗口显示此计算机已安装好的Internet服务,而且都已自动启动运行,其中web站点有两个,分别是默认web站点和管理站点。

云南大学 软件学院 计网实验8

云南大学 软件学院 计网实验8

云南大学软件学院实验报告课程:计算机网络原理实验任课教师:姓名:学号:专业:成绩:实验八、Link States Algorithm的实现1.实验目的:通过编程模拟实现LSA.2.实验环境:软件开发平台,可以使用任何编程语言。

3.实验要求(1)求网络中任何两个结点之间的最短路径(网络中至少有4个节点)。

(2)得到任何一个节点上的转发表。

4.实验内容、拓扑结构通过链路状态算法计算A点到其它各点的cost,最终输出A的路由表。

# include<stdio.h># include<stdlib.h># define maxlen 10# define large 999 //(该处设置路径最大值,表示不存在该路线)typedef struct{int vexnum;char vexs[maxlen];int arcs[maxlen][maxlen];}graph;void init_graph(graph *g)//初始化图{int i = 0,j = 0;g -> vexnum = 5; //根据题目此处将图的节点数初始化为5个for(i = 0; i < 5; i++) //经过两层循环将条路径初始化为无穷大for(j = 0; j < 5; j++)g -> arcs[i][j] = 999;g -> arcs[0][1] = 7; g -> arcs[1][0] = 7; //将相邻两个节点的路径初始化为其权值g -> arcs[0][4] = 1; g -> arcs[4][0] = 1;g -> arcs[1][2] = 1; g -> arcs[2][1] = 1;g -> arcs[2][3] = 2; g -> arcs[3][2] = 2;g -> arcs[1][4] = 8; g -> arcs[4][1] = 8;g -> arcs[3][4] = 2; g -> arcs[4][3] = 2;g -> vexs[0] = 'A'; //将节点值初始化g -> vexs[1] = 'B';g -> vexs[2] = 'C';g -> vexs[3] = 'D';g -> vexs[4] = 'E';}void shortpath_dijkstra(graph g)//寻找最短路径{int cost[maxlen][maxlen]; //cost[i][j]: 节点i到节点j的成本int dist[maxlen]; //dist[i]: 源节点到i节点的距离或者是成本int path[maxlen]; //已经经过了的节点int s[maxlen]; //如果 s[i] = 1,那么i节点已经纳入最短路径集合int i,j,v0,min,u;char e;printf("Input the source point(AorBorCorDorE):");//用户输入源节点scanf("%c",&e);switch(e){case'A':v0=0;break;case'B':v0=1;break;case'C':v0=2;break;case'D':v0=3;break;case'E':v0=4;break;}for(i = 0; i < g.vexnum; i++){for(j = 0; j < g.vexnum; j++)cost[i][j] = g.arcs[i][j];}for(i = 0; i < g.vexnum; i++){dist[i] = cost[v0][i]; //初始化源节点到各个节点的成本,如果与源节点相邻则成本为权值,否则为无穷大if(dist[i] < large && dist[i] > 0)path[i] = v0;s[i] = 0;}s[v0] = 1;for(i = 0; i < g.vexnum; i++){min = large;u = v0;for(j = 0; j < g.vexnum; j++)if(s[j] == 0 && dist[j] < min){min = dist[j];u = j;}s[u] = 1;for(j = 0; j < g.vexnum; j++)if(s[j] == 0 && dist[u] + cost[u][j] < dist[j]){dist[j] = dist[u] + cost[u][j];path[j] = u;}}printf("Output%c\n\n",e);for(i = 0; i < g.vexnum; i++)if(s[i] == 1){u = i;while(u != v0){printf(" %c <- ",g.vexs[u]);u = path[u];}printf(" %c ",g.vexs[u]);printf(" :%d \n",dist[i]);}else printf(" %c <- %c: no path \n",g.vexs[i],g.vexs[v0]);}int main(){graph g;init_graph(&g);shortpath_dijkstra(g);system("pause");return 0;}从A点开始,寻找到其余各点的最短路径截图如下:4.实验分析,回答下列问题(1)给出LSA算法的主要思想。

计算机网络原理实验三 云南大学

计算机网络原理实验三 云南大学

实验三、套接字编程序号:姓名:学号:成绩1.实验目的:两人一组,编写一个客户端、服务器程序,掌握Socket编程原理。

2.实验环境:连入局域网络的主机一台。

3.实验指导:Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制。

理解socket编程模型及其原理。

4.实验分析,回答下列问题。

客户端IP:172.25.20.4服务器IP:172.25.20.194客户端源代码:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <conio.h>#include <winsock2.h>#include <windows.h>#pragma comment(lib,"ws2_32.lib")#define PORT 3490 /* 客户机连接远程主机的端口*/#define MAXDATASIZE 100 /* 每次可以接收的最大字节*/int _tmain(int argc, _TCHAR* argv[]){WORD wVersionRequested;WSADATA wsaData;int err = 0 ,rval = 0 ;SOCKET fd;struct sockaddr_in servaddr;struct hostent* hp;char buf[1024] = "";wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("Can not create socket!");exit(2);}servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);hp = gethostbyname("172.25.20.194");//根据服务器的网络计算//机名称得到其IP地址等信息memcpy((char*)&servaddr.sin_addr, (char*)hp->h_addr,hp->h_length); memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero));//和服务器创建连接rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr));if (rval < 0){//创建连接失败printf("Can not create connect!");exit(3);}else{ memset(buf, 0, 1024);printf("Please input a line to server:");scanf("%s",&buf);//向服务器发送信息rval = send(fd, buf, strlen(buf) + 1,0);if(rval < 0)printf("Write error!");}closesocket(fd);exit(5);}服务器源代码:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include<conio.h>#include<windows.h>#include<winsock2.h>#pragma comment(lib,"ws2_32.lib")#define MYPORT 3490 /*定义用户连接端口*/#define BACKLOG 10 /*多少等待连接控制*/#define SERVER_IP_ADDR "172.25.20.194" /*服务器的IP地址*/int _tmain(int argc, _TCHAR* argv[]){SOCKET sock, msgsock;int length = 0;struct sockaddr_in server;struct sockaddr tcpaddr;char buf[1024] = "";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 #%d\n", 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) < 0))perror("reading stream message");if (rval == 0)printf("-->%s\n", buf);}closesocket(msgsock);} while (TRUE);/* 因为这个程序已经有了一个无限循环,所以套接字"sock"从来不显式关闭。

云大计算机网络原理实验三

云大计算机网络原理实验三

实验三、套接字编程序号:姓名:学号:成绩1.实验目的:两人一组,编写一个客户端、服务器程序,掌握Socket编程原理。

2.实验环境:连入局域网络的主机一台。

3.实验指导:Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制。

理解socket编程模型及其原理。

4.实验分析,回答下列问题。

a.运行指导书中的程序,并修改服务器的功能(自己思考),改写成多线程web服务器(选作),附上源代码,并加关键代码注释。

源代码做修改的地方:1. #define SERVER_IP_ADDR "192.168.1.102" /*服务器的IP地址*/改为:#define SERVER_IP_ADDR "113.55.16.44" /*服务器的IP地址*/2. hp = gethostbyname("YUQIAN-SOFT"); //根据服务器的网络计算//机名称得到其IP地址等信息改为:hp = gethostbyname("113.55.16.44"); //根据服务器的网络计算//机名称得到其IP地址等信息修改依据:该程序的流程图:b.给出程序调试和运行的截图。

c.回答下列问题:(1)为什么在服务器和客户端要包含winsock2.h文件?答:这是系统自定义的“宏”,其中还包含了许多自定义的类型,如果不包含该文件,程序中会有许多类型无法识别。

(2)为什么在服务器和客户端程序中要加入#pragma comment(lib,"ws2_32.lib") 语句,如果不加会出现什么问题?答:这句话的意思是链接“ws2_32.lib”这个库,这种方法写的程序别人在使用你的代码的时候就不用再设置工程settings了。

如果不加,因为没有链接到这个库,就会有unresolved external symbol __imp__WSACleanup@0之类的错误。

云南大学软件学院计算机网络原理期中试卷 王世普

云南大学软件学院计算机网络原理期中试卷 王世普

云南大学2015至2016学年上学期软件学院2014级《计算机网络原理》期中考试试卷(闭卷)答案满分:100分考试时间:100分钟任课教师:王世普第一题答题卡:第二题答题卡:1.(1)is the protocol suite for the current Internet..(1)A. NCP B. TCP/IP C.UNIX D.ACM2.A GIF image is sent as email ,What is the content-type (2) .(2)A.multipart/mixed B.multipart/imageC.image/JPEG D.image/gif3.A user want to send some forms(表单)to Web server using HTTP protocol, the request line method is (3).(3)A.GET B.PA TCH C.MOVE D.POST4.If a TCP segment carries data along with an acknowledgment, this technology is called (4)acknowledgment.(4)A. backpacking B. piggybacking C. piggying D. mother’s help5.TCP is a (5)transport layer protocol that ensure data to be exchanged reliably by(6). So it requires set up connection before data exchanged by ( 7 )-way handshaking.(5)A.connection B.connectionless C.join D.disconnection(6)A.datagrams B.acknowledgements C.data D.segment(7)A.one B.two C.three D.four6.A user requests a Web page that consists of a basic HTML file and 5 JPEG image files. d trans denoting the time to transfer a file. The total time is (8) to request the Web page inNonpersistent connections mode?(8)A. 6(2RTT+ d trans) B. 2RTT+6 d trans C. RTT+6 d trans D.6(RTT+ d trans)7.Host A sends a TCP segment (Seq = 1, ACK = 111) to host B and Host B replies with a TCP segment (Seq = 111, ACK = 81). The payload length of the TCP segment from host A to hostB is ( 9 ) .(9)A.80 bytes. B.81 bytes. C.82 bytes. D.unknown8.As a data packet moves from the lower to the upper layers, header are (10).(10)A. modified B. added C. subtracted D. rearranged二、判断正误(每个问题1分,共5分。

云南大学软件学院计算机网络原理实验七

云南大学软件学院计算机网络原理实验七

实验七、Link States Algorithm 的实现序号:_____ 姓名: __________ 学号:2016 成绩 _________1. 实验目的:通过编程模拟实现LSA.2. 实验环境:软件开发平台,可以使用任何编程语言。

3. 实验要求(1)求网络中任何两个结点之间的最短路径(网络中至少有4个节点)。

(2)得到任何一个节点上的转发表。

4. 实验内容、拓扑结构通过链路状态算法计算A点到其它各点的cost,最终输出A的路由表。

算法提示:In itializati on:2 N' = {u} /*u is source node*/3 for all no des j /* j is dest no de*/4 if j adj ace nt to u5 then D(j) = c(u,j)6 else D(j) = g77 Loop8 find i not in N' such that D(i) is a minimum9 add i to N'10 update D(j) for all j adjace nt to i and not in N':11 D(j) = min( D(j), D(i) + c(i,j))12 /* new cost to j is either old cost to j or known13 shortest path cost to i plus cost from i to j */14 until all nodes in N'4.实验分析,回答下列问题(1)给出LSA算法的主要思想。

LSA 算法即链路状态选路算法, 该算法中,网络拓扑和所有的链路费用都是已知的。

它的具体实现依据Dijkstra 算法,其主要思想是计算从某节点(源节点, u )到网络中所有其他节点的最短路径。

其算法是迭代算法, 即经算法的第k 次迭代后,可知道到k 个目的节点的最低 费用路径,在在到所有目的节点的最低费用路径之中,这k 条路径具有k 个最低费用。

云南大学计算机网络工程实验

云南大学计算机网络工程实验

云南大学计算机网络工程实验引言计算机网络工程实验是云南大学计算机网络工程专业的重要实践环节,旨在帮助学生通过实际操作掌握计算机网络相关的实验技能和知识。

本文档将介绍云南大学计算机网络工程实验的基本内容和实施步骤。

实验目的计算机网络工程实验的主要目的是培养学生的实验能力和动手能力,加深对计算机网络概念的理解,提升对计算机网络原理的应用能力。

通过实验,学生将能够掌握计算机网络的基本概念、网络协议的原理和应用,以及网络设备的配置和管理等技能。

实验内容云南大学计算机网络工程实验内容包括以下几个方面:1. 网络配置实验该实验主要包括网络连接配置、IP地址配置、子网划分和路由器配置等内容。

学生将学习如何配置网络设备,正确连接计算机网络,配置IP地址和子网掩码,实现网络间的通信。

2. 网络安全实验网络安全实验主要涉及网络攻击与防御的知识和技能。

学生将学习如何识别和应对常见的网络攻击方式,如DDoS攻击、SQL注入攻击等,并学习安全策略的制定和实施。

3. 网络性能实验网络性能实验主要针对网络带宽、延迟、丢包率等性能指标的测试与优化。

学生将学习使用网络性能测试工具,分析网络性能数据,并提出优化方案,改善网络的性能。

4. 网络应用实验在网络应用实验中,学生将学习如何配置和管理网络应用服务,如Web服务器、邮件服务器和文件传输服务器等。

通过实际操作,学生将了解如何搭建和管理各种网络应用服务。

实施步骤云南大学计算机网络工程实验的具体步骤如下:1.实验准备:根据实验要求,准备所需的实验设备和软件工具。

确保实验环境的正常运行。

2.实验设置:按照实验要求,配置实验环境。

包括网络设备的连接和配置,计算机的IP地址和子网掩码的配置等。

3.实验操作:根据实验指导书的要求,进行实验操作。

实验过程中需按照实验要求记录实验数据和结果。

4.实验分析:根据实验数据和结果,进行实验分析。

通过分析,找出问题所在,提出解决方案。

5.实验总结:总结实验过程中的经验和教训,归纳实验中的关键点和要点。

熵的计算

熵的计算

云南大学数学与统计学实验教学中心实验报告一、实验目的:熟悉信息论中常用的各种熵的计算。

二、实验内容:1. 给定二维分布函数,计算联合熵H(x,y)、条件熵H(x|y)、互信息I(x;y)、各变量的熵H(x),H(y)。

可选择课本例题2.2.1作为程序测试用例。

2. 自行设定原始数据(如一段文本、一幅图像、一个数据表等),按照频率计算符号的分布,进而计算有关的熵。

三、实验环境MATLAB 、Win7四、实验过程(请学生认真填写):实验过程、结果以及相应的解释:1. 实验过程一)第一大题:A、通过对联合熵H(x,y)、条件熵H(x|y)、互信息I(x;y)、各变量的熵H(x),H(y)各变量之间以及其自身的求值公式以及X、Y的联合分布,便可以将各值求解出来。

B、具体代码如下:clcclearp=[1/8 1/16 1/32 1/32;1/16 1/8 1/32 1/32;1/16 1/16 1/16 1/16;1/4 0 0 0];py=0;px=0;H_xy = 0;H_x_y =[0 0 0 0];H_y_x =[0 0 0 0];sum1 = 0;sum2 = 0;format rat%%%-------求I(X;Y)-----for i=1:1:4for j=1:1:4if(p(i,j)==0)p(i,j)=eps;endsum1 = sum1 + p(i,j)*log2(1/(p(i,j)));endH_xy = H_xy + sum1;sum1=0;endfprintf(2,'联合熵I(X;Y):') ;H_xy%%%-------求H(X|Y)、H(Y|X)、H(X)、H(Y)--------%求出y的边沿分布%求出x的边沿分布for i=1:4for j=1:4sum1 = sum1 + p(i,j);sum2 = sum2 + p(j,i);endpy(i)= sum1; %py是关于x的边缘分布px(i)= sum2; %px是关于x的边缘分布sum1 = 0;sum2 = 0;end%求出在 Y=i时,X的分布情况%以及求出在 X=i时,Y的分布情况for i=1:4for j=1:4Hy(i,j)= p(i,j)/py(i);Hx(i,j)= p(j,i)/px(i);endend%求H(x|y=i)%求H(y|x=i)for i=1:4for j=1:4H_x_y(i) = H_x_y(i) + Hy(i,j)*log2(1/Hy(i,j)); H_y_x(i) = H_y_x(i) + Hx(i,j)*log2(1/Hx(i,j));endendA=H_x_y.*py;B=H_y_x.*px;fprintf(2,'条件熵H(X|Y):') ;sum(A,2)fprintf(2,'条件熵H(Y|X):') ;sum(B,2)fprintf(2,'熵H(X):') ;H_xy-sum(A,2)fprintf(2,'熵H(Y):') ;H_xy-sum(B,2)C、结果如下图:二)第二大题A、根据题意,选取了用一段文本来计算他的熵。

实验一熟悉常用的网络命令实验报告范文-数媒

实验一熟悉常用的网络命令实验报告范文-数媒

实验一熟悉常用的网络命令实验报告范文-数媒云南大学软件学院实验报告课程:计算机网络原理实验任课教师:姓名:学号:专业:数字媒体技术成绩:1.实验目的:学会使用常用ping,ipconfig,nlookup,arp,tracert等常用网络测试命令检测网络连通、了解网络的配置状态,跟踪路由等相关网络问题。

2.实验环境:(1)运行window2000/2003/某p操作系统的PC一台。

(2)每台PC机具有一块网卡,通过双绞线与局域网网相连。

(3)局域网能连接Internet。

3.实验步骤:参见实验指导手册内容。

4.实验分析,回答下列问题(1)查看本机TCP/IP协议配置,看你的计算机是通过自动获取IP 还是通过手动方式设置IP地址的?写出判断的理由。

通过ipconfig/all显示所有适配器的完整TCP/IP信息,在所显示的信息中本机自动配置已启动,可以自动获取IP地址,所以我的计算机是通过自动获取IP。

(2)通过手动方式或者是自动获取方式,可以读取本机的IP地址,子网掩码,默认网关,首选DNS服务器地址,并填写下表。

(注意要填写的是局域网网卡接口的IPV4地址,而不是虚拟机网络VMnet的地址,也不是IPV6地址)(3)在获取本机IP地址之后,在MS-DOS方式下运行下列Ping命令,填写实验运行结果(附截图)。

(a)ping本机IP地址:(b)ping默认网关–n6:(c)ping本局域网内任意一台主机:(4)用nlookup命令从域名地址当中解析出IP地址,从IP地址当中解析出域名地址。

(6)用nettat命令,显示以太网接口的统计信息,并显示所有已建立好的有效连接。

(7)用arp命令查看arp地址映射表,填加一条静态地址映射,并显示结果和操作过程。

(8)说明实验过程当中遇到的问题及解决方法。

2.在完成arp相关指令的任务是没有掌握正确的步骤,导致无法正确添加静态地址映射。

2022年云南大学软件工程专业《计算机网络》科目期末试卷A(有答案)

2022年云南大学软件工程专业《计算机网络》科目期末试卷A(有答案)

2022年云南大学软件工程专业《计算机网络》科目期末试卷A(有答案)一、选择题1、比特的传播时延与链路带宽的关系是()。

A.没有关系B.反比关系C.正比关系D.无法确定2、()属于TCP/IP协议簇的应用层应用服务元素。

A.文件传输协议FTPB.用户数据报协议UDPC.控制报文协议ICMPD.地址解析协议ARP3、设有两个了子网202.118.133.0/24和202.118.130.0/24,如果进行路由聚,得到的网络地址是()。

A.202.118.128.0/21B.202.118.128.0/22C.202.118.130.0/22D.202.118.132.0/204、在因特网中,IP分组的传输需要经过源主机和中间路由器到达目的主机,通常()。

A.源主机和中间路由器都知道IP分组到达目的主机需要经过的完整路径B.源主机知道IP分组到达日的主机需要经过的完整路径,而中间路由器不知道C.源主机不知道IP分组到达目的主机需要经过的完整路径,而中间路由器知道D.源主机和中间路由器都不知道IP分组到达目的主机需要经过的完整路径5、PPP中的LCP帧起到的作用是()。

A.在建立状态阶段协商数据链路协议的选项B.配置网络层协议C.检查数据链路层的错误,并通知错误信息D.安全控制,保护通信双方的数据安全6、在下列多路复用技术中,()具有动态分配时隙的功能。

A.同步时分多路复用B.码分多路复用C.统计时分多路复用D.频分多路复用7、下列关于传输层协议中面向连接的描述,()是错误的。

A.面向连接的服务需要经历3个阶段:连接建立、数据传输以及连接释放B.面向连接的服务可以保证数据到达的顺序是正确的C.面向连接的服务有很高的效率和时间性能D.面向连接的服务提供了一个可靠的数据流8、假设某应用程序每秒产生一个60B的数据块,每个数据块被封装在一个TCP报文中,然后再封装到一个IP数据报中,那么最后每个数据报所含有的应用数据所占的百分比是()(注意:TCP报文和IP数据报的首部没有附加字段)。

云南大学软件学院计算机网络原理实验六实验报告3

云南大学软件学院计算机网络原理实验六实验报告3

实验六、传输层可靠传输协议GBN编程实验报告序号:姓名:学号:成绩指导老师:一、实验目的:1、通过编写实现一个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。

二、实验指导:参考教材。

动画演示:三、实验要求:编程实现一个GBN传输协议的发送方和接收方两程序,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.1.实验流程图如下:N2.实验截图与代码如下: 截图: 传送下一个数据包结束代码及注释:一、GBN.h#pragma once#include <stdio.h>//基础功能模块的数据结构声明#define BIDIRECTIONAL 1 /* change to 1 if you're doing extra credit andwrite a routine called B_output *//* a "msg" is the data unit passed from layer 5 (teachers code) to layer4 (students' code). It contains the data (characters) to be delivered tolayer 5 via the students transport level protocol entities. */struct msg{ char data[20];};/* a packet is the data unit passed from layer 4 (students code) to layer3 (teachers code). Note the pre-defined packet structure, which allstudents must follow. */struct pkt{int seqnum;int acknum;int checksum;char payload[20];};#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE 1#define FALSE 0#define A 0#define B 1//网络仿真部分数据结构声明***********************************************************struct event{float evtime; /* event time */int evtype; /* event type code */int eventity; /* entity where event occurs */struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */ struct event *prev;struct event *next;};/* possible events: */#define TIMER_INTERRUPT 0#define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1//基础功能模块的函数声明******************************************************************* void ComputeChecksum(struct pkt *packet);//计算校验和int CheckCorrupted(struct pkt packet);//检查数据是否出错void A_output( struct msg message);//A端向外发送数据void A_input(struct pkt packet);//A端接收数据void A_timerinterrupt();//A计时器超时void A_init();//A端初始化void B_output(struct msg message);void B_input(struct pkt packet);void B_timerinterrupt();void B_init();//网络仿真部分的函数声明**************************************************void init(); //初始化仿真器float jimsrand();//随机数发生器[0,1]//处理事件列表部分的函数声明*********************************************void generate_next_arrival();//产生下一个到达的分组void insertevent(struct event *p);//向事件列表中插入一条新的事件void printevlist();//打印事件列表//******************************************************************** //**********************计时器模块*********************************** void stoptimer(int);//停止计时器void starttimer(int,float);//启动计时器//******************************************************************** *//**************************网络各层之间传送模块***********************void tolayer3(int AorB,struct pkt packet);//向第3层发送信息void tolayer5(int AorB,char datasent[20]);//向第5层发送信息二、GBN.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE = 1; /* for my debugging */为我的调试extern int nsim = 0; /* number of messages from 5 to 4 so far */目前为止信息的数字是从5到4extern int nsimmax = 0; /* number of msgs to generate, then stop */如果信息产生的数字为0,然后就停止extern float time = 0.000;float lossprob; /* probability that a packet is dropped */数据包可能会丢失float corruptprob; /* probability that one bit is packet is flipped*/这一点的数据包可能会被弹出去float lambda; /* arrival rate of messages from layer 5 */ 第五层到达的信息的次序int ntolayer3; /* number sent into layer 3 */被传送到第三层的数据static int nlost = 0; /* number lost in media */在媒介中数据丢失static int ncorrupt = 0; /* number co rrupted by media*/被媒介毁坏的数据static int expectedseqnum = 0; /* expected se quence number at receiver side */在接收者这边接收到预期的序列数据static int nextseqnum; /* next sequence number to use in sender side */下一个序列数据使用在发送者这边static int base; /* t he head of sender window */发送者的头窗口struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */数据包缓冲区窗口static int winfront,winrear; /* front and rear points of wind ow buffer */窗口缓冲区的前方点和后方点static int pktnum; /* packet number of window buffer */窗口缓冲区的数据包个数struct msg buffer[MAXBUFSIZE]; /* sender message buffer */发送消息缓冲区int buffront,bufrear; /* front and rear pointers of buffer */缓冲区的前指针与后指针static int msgnum; /* message number of buffer */信息数量的缓冲int packet_lost =0;int packet_corrupt=0;int packet_sent =0;extern int packet_correct=0;extern int packet_resent =0;int packet_timeout=0;extern struct event *evlist = NULL; /* the event list *///计算校验和void ComputeChecksum( struct pkt *packet){int checksum;int i;checksum = packet->seqnum;checksum = checksum + packet->acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet->payload[i]);checksum = 0-checksum;packet->checksum = checksum;}//检查是否出错int CheckCorrupted(struct pkt packet){int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet.payload[i]);if ( (packet.checksum+checksum) == 0 )return (FALSE);elsereturn (TRUE);}//A端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void A_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* update state variables */nextseqnum = nextseqnum+1;starttimer(A,RTT);B_input(sendpkt);A_input(sendpkt);}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//B端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void B_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);A_input(sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* if it is the first packet in window, start timeout */ //if ( base == nextseqnum )//{//starttimer(A,RTT);//printf("----A: start a new timer!\n");// }/* update state variables */nextseqnum = nextseqnum+1;}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//A端接收数据void A_input(struct pkt packet){struct pkt sendpkt;int i;/* if received packet is not corrupted and ACK is received */if ( (CheckCorrupted(packet) == FALSE) && (packet.acknum != NACK) ) {printf("----A: ACK %d is correctly received,",packet.acknum);packet_correct++;/* delete the acked packets from window buffer */winfront = (winfront+(packet.acknum+1-base)) % WINDOWSIZE; pktnum = pktnum - (packet.acknum+1-base);/* move window base */base = packet.acknum+1;stoptimer(A);if ( base < nextseqnum){//starttimer(A,RTT);printf ("\n\n\nsend new packets!");}/* if buffer is not empty, send new packets */while ( (msgnum!=0) && (nextseqnum<base+WINDOWSIZE) ) {/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;buffront = (buffront+1) % MAXBUFSIZE;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = buffer[buffront].data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* if it is the first packet in window, start timeout */if ( base == nextseqnum ){//starttimer(A,RTT);printf ("send new packets!\n");}/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;winbuf[winrear] = sendpkt;pktnum ++;/* update state variables */nextseqnum = nextseqnum+1;/* delete message from buffer */msgnum --;}}elseprintf ("----A: NACK is received, do nothing!\n");}//B端接收数据*****************************************************一定要调用这个/* Note that with simplex transfer from a-to-B, there is no B_output() */ /* called from layer 3, when a packet arrives for layer 4 at B*/void B_input(struct pkt packet){struct pkt sendpkt;int i;/* if not corrupted and received packet is in order */if ( (CheckCorrupted(packet) == FALSE) && (packet.seqnum == expectedseqnum)){printf("\n----B: packet %d is correctly received, send ACK!\n",packet.seqnum);/* send an ACK for the received packet *//* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = expectedseqnum;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet *///tolayer3 (B, sendpkt);/* update state variables */expectedseqnum = expectedseqnum+1;printf("----B:expectedseqnum = %d\n",expectedseqnum);/* deliver received packet to layer 5 *///tolayer5(B,packet.payload);}/* otherwise, discard the packet and send a NACK */else{printf("----B: packet %d is corrupted or not I expects, send NACK!\n",packet.seqnum);/* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = NACK;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (B, sendpkt);}}//A计时器超时/* called when A's timer goes off */void A_timerinterrupt(){int i;printf("----A: time out,resend packets!\n");/* start timer */starttimer(A,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(A,winbuf[(winfront+i)%WINDOWSIZE]);}}//B计时器超时/* called when B's timer goes off */void B_timerinterrupt(){int i;printf("----B: time out,resend packets!\n");/* start timer */starttimer(B,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(B,winbuf[(winfront+i)%WINDOWSIZE]);}}//A端初始化/* entity A routines are called. You can use it to do any initialization */void A_init()base = 0;nextseqnum = 0;buffront = 0;bufrear = 0;msgnum = 0;winfront = 0;winrear = 0;pktnum = 0;}//B端初始化/* entity B routines are called. You can use it to do any initialization */void B_init(){expectedseqnum = 0;}//初始化仿真器void init() /* initialize the simulator */{int i;float sum, avg;float jimsrand();FILE *fp;fp = fopen ("parameter.txt","r");printf("----- Stop and Wait Network Simulator Version 1.1 -------- \n\n");printf("Enter the number of messages to simulate: ");//fscanf(fp,"%d",&nsimmax);scanf("%d",&nsimmax);printf("\nEnter packet loss probability [enter 0.0 for no loss]: "); //fscanf(fp, "%f",&lossprob);scanf("%f",&lossprob);printf("\nEnter packet corruption probability [0.0 for no corruption]: "); //fscanf(fp,"%f",&corruptprob);scanf("%f",&corruptprob);printf("\nEnter average time between messages from sender's layer5 [ > 0.0]: ");//fscanf(fp,"%f",&lambda);scanf("%f",&lambda);printf("\nEnter TRACE: ");//fscanf(fp,"%d",&TRACE);scanf("%d",&TRACE);printf("\n\n");srand(9999); /* init random number generator */sum = 0.0; /* test random number generator for students */for (i=0; i<1000; i++)sum=sum+jimsrand(); /* jimsrand() should be uniform in [0,1] */avg = sum/1000.0;/*if(avg < 0.25 || avg > 0.75){printf("It is likely that random number generation on your machine\n" ); printf("is different from what this emulator expects. Please take\n"); printf("a look at the routine jimsrand() in the emulator code. Sorry. \n");exit(0);}*/printf("%f",avg);ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */generate_next_arrival(); /* initialize event list */}//随机数发生器float jimsrand(){double mmm = 2147483647; /* largest int - MACHINE DEPENDENT */float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [0,1] */return(x);}//**************************************************************************************//*******************************事件处理部分*******************************************void generate_next_arrival(){double x,log(),ceil();struct event *evptr;float ttime;int tempint;//if (TRACE>2)//printf("-----------------GENERATE NEXT ARRIVAL: creating new arrival\n");x = lambda*jimsrand()*2; /* x is uniform on [0,2*lambda] *//* having mean of lambda */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + x;evptr->evtype = FROM_LAYER5;if (jimsrand()<0.5){evptr->eventity = A;}evptr->eventity = B;insertevent(evptr);}//向事件列表中插入一条新的事件void insertevent(struct event *p){struct event *q,*qold;if (TRACE>2){//printf(" INSERTEVENT: time is %lf\n",time);//printf(" INSERTEVENT: future time will be %lf\n",p->evtime);}q = evlist; /* q points to front of list in which p struct inserted */if (q==NULL)/* list is empty */{evlist=p;p->next=NULL;p->prev=NULL;}else{for (qold = q; q !=NULL && p->evtime > q->evtime; q=q->next) qold=q;if (q==NULL)/* end of list */{qold->next = p;p->prev = qold;p->next = NULL;}else if (q==evlist)/* front of list */p->next=evlist;p->prev=NULL;p->next->prev=p;evlist = p;}else /* middle of list */{p->next=q;p->prev=q->prev;q->prev->next=p;q->prev=p;}}}//打印事件列表void printevlist(){struct event *q;int i;printf("--------------\nEvent List Follows:\n");for(q = evlist; q!=NULL; q=q->next){printf("Event time: %f, type: %d entity: %d\n",q->evtime,q->evtype,q->eventity);}printf("--------------\n");}//启动计时器void starttimer(int AorB,float increment){struct event *q;struct event *evptr;if (TRACE>2)printf("\n----A: START TIMER: starting timer at %f\n",time);/* be nice: check to see if timer is already started, if so, then warn *//* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) ){//printf("Warning: attempt to start a timer that is already started\n");return;}/* create future event for when timer goes off */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + increment;evptr->evtype = TIMER_INTERRUPT;evptr->eventity = AorB;insertevent(evptr);}//停止计时器/* called by students routine to cancel a previously-started timer */ void stoptimer(int AorB) /* A or B is trying to stop timer */{struct event *q,*qold;if (TRACE>2)printf("\n----A: STOP TIMER: stopping timer\n");/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) )/* remove this event */{if (q->next==NULL && q->prev==NULL)evlist=NULL; /* remove first and only event on listelse if (q->next==NULL) /* end of list - there is one in front */ q->prev->next = NULL;else if (q==evlist) /* front of list - there must be event after */{q->next->prev=NULL;evlist = q->next;}else /* middle of list */{q->next->prev = q->prev;q->prev->next = q->next;}free(q);return;}//printf("Warning: unable to cancel your timer. It wasn't running.\n");}//向第三层发送信息/************************** TOLAYER3 ***************/void tolayer3(int AorB,struct pkt packet){struct pkt *mypktptr;struct event *evptr,*q;float lastime, x, jimsrand();int i;ntolayer3++;/* simulate losses: */if (jimsrand() < lossprob){nlost++;if (TRACE>0)printf(" TOLAYER3: packet being lost\n");return;}/* make a copy of the packet student just gave me since he/she may decide *//* to do something with the packet after we return back to him/her */ mypktptr = (struct pkt *)malloc(sizeof(struct pkt));mypktptr->seqnum = packet.seqnum;mypktptr->acknum = packet.acknum;mypktptr->checksum = packet.checksum;for (i=0; i<20; i++)mypktptr->payload[i] = packet.payload[i];if (TRACE>2){printf(" TOLAYER3: seq: %d, ack %d, check: %d ", mypktptr->seqnum,mypktptr->acknum, mypktptr->checksum);for (i=0; i<20; i++)printf("%c",mypktptr->payload[i]);printf("");}/* create future event for arrival of packet at the other side */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtype = FROM_LAYER3; /* packet will pop out from layer3 */ evptr->eventity = (AorB) % 2; /* event occurs at other entity */evptr->pktptr = mypktptr; /* save ptr to my copy of packet *//* finally, compute the arrival time of packet at the other end. medium can not reorder, so make sure packet arrives between 1 and 10 time units after the latest arrival time of packetscurrently in the medium on their way to the destination */lastime = time;/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==FROM_LAYER3 && q->eventity==evptr->eventity) ) lastime = q->evtime;evptr->evtime = lastime + 1 + 9*jimsrand();/* simulate corruption: */if (jimsrand() < corruptprob){ncorrupt++;if ( (x = jimsrand()) < .75)mypktptr->payload[0]='Z'; /* corrupt payload */else if (x < .875)mypktptr->seqnum = 999999;elsemypktptr->acknum = 999999;if (TRACE>0)printf(" TOLAYER3: packet being corrupted\n");}//if (TRACE>2)//printf(" TOLAYER3: scheduling arrival on other side\n");insertevent(evptr);}//向第五层发送信息/************************** TOLAYER5 ***************/void tolayer5(int AorB,char datasent[20]){int i;if (TRACE>2){printf(" TOLAYER5: data received: ");for (i=0; i<20; i++)printf("%c",datasent[i]);printf("\n");}}三、GBN-CS.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE ; /* for my debugging */extern int nsim ; /* number of messages from 5 to 4 so far */extern int nsimmax; /* number of msgs to generate, then stop */extern float time;extern int packet_correct;extern int packet_resent;extern struct event *evlist;int main(){struct event *eventptr;struct msg msg2give;struct pkt pkt2give;int i,j;char c;init();A_init();B_init();while (1){eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL)goto terminate;evlist = evlist->next; /* remove this event from event list */if (evlist!=NULL)evlist->prev=NULL;if (TRACE >= 2){printf("\nEVENT time: %f,",eventptr->evtime);printf(" type: %d",eventptr->evtype);if (eventptr->evtype==0)printf(", timerinterrupt ");else if (eventptr->evtype==1)printf(", fromlayer5 ");elseprintf(", fromlayer3 ");printf(" entity: %d\n",eventptr->eventity);}time = eventptr->evtime; /* update time to next event time*/if (nsim==nsimmax)break; /* all done with simulation */if (eventptr->evtype == FROM_LAYER5 ){generate_next_arrival(); /* set up future arrival *//* fill in msg to give with string of same letter */j = nsim % 26;for (i=0; i<20; i++)msg2give.data[i] = 97 + j;if (TRACE>2){printf(" MAINLOOP: data given to student: ");for (i=0; i<20; i++)printf("%c", msg2give.data[i]);printf("\n");}nsim++;if (eventptr->eventity == A){A_output(msg2give);}else{B_output(msg2give);}}else if (eventptr->evtype == FROM_LAYER3){pkt2give.seqnum = eventptr->pktptr->seqnum;pkt2give.acknum = eventptr->pktptr->acknum;pkt2give.checksum = eventptr->pktptr->checksum;for (i=0; i<20; i++)pkt2give.payload[i] = eventptr->pktptr->payload[i];if (eventptr->eventity == A) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */elseB_input(pkt2give);free(eventptr->pktptr); /* free the memory for packet */ }else if (eventptr->evtype == TIMER_INTERRUPT){if (eventptr->eventity == A)A_timerinterrupt();elseB_timerinterrupt();}else{printf("INTERNAL PANIC: unknown event type \n");}free(eventptr);}terminate:printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time,nsim);printf(" correctly sent pkts: %d \n", packet_correct);printf(" resent pkts: %d \n", packet_resent);system("pause");}附源代码及注释四. 实验小结通过本次试验了解了编程实现简单可靠的数据传输GBN协议,模拟了可靠数据传输理解了TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三、套接字编程序号:姓名:学号:成绩1.实验目的:两人一组,编写一个客户端、服务器程序,掌握Socket编程原理。

2.实验环境:连入局域网络的主机一台。

3.实验指导:Socket API是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制。

理解socket编程模型及其原理。

4.实验分析,回答下列问题。

客户端IP:172.25.20.4服务器IP:172.25.20.194客户端源代码:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <conio.h>#include <winsock2.h>#include <windows.h>#pragma comment(lib,"ws2_32.lib")#define PORT 3490 /* 客户机连接远程主机的端口*/#define MAXDATASIZE 100 /* 每次可以接收的最大字节*/int _tmain(int argc, _TCHAR* argv[]){WORD wVersionRequested;WSADATA wsaData;int err = 0 ,rval = 0 ;SOCKET fd;struct sockaddr_in servaddr;struct hostent* hp;char buf[1024] = "";wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("Can not create socket!");exit(2);}servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);hp = gethostbyname("172.25.20.194");//根据服务器的网络计算//机名称得到其IP地址等信息memcpy((char*)&servaddr.sin_addr, (char*)hp->h_addr,hp->h_length); memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero));//和服务器创建连接rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr));if (rval < 0){//创建连接失败printf("Can not create connect!");exit(3);}else{ memset(buf, 0, 1024);printf("Please input a line to server:");scanf("%s",&buf);//向服务器发送信息rval = send(fd, buf, strlen(buf) + 1,0);if(rval < 0)printf("Write error!");}closesocket(fd);exit(5);}服务器源代码:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include<conio.h>#include<windows.h>#include<winsock2.h>#pragma comment(lib,"ws2_32.lib")#define MYPORT 3490 /*定义用户连接端口*/#define BACKLOG 10 /*多少等待连接控制*/#define SERVER_IP_ADDR "172.25.20.194" /*服务器的IP地址*/int _tmain(int argc, _TCHAR* argv[]){SOCKET sock, msgsock;int length = 0;struct sockaddr_in server;struct sockaddr tcpaddr;char buf[1024] = "";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 #%d\n", 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) < 0))perror("reading stream message");if (rval == 0)printf("-->%s\n", buf);}closesocket(msgsock);} while (TRUE);/* 因为这个程序已经有了一个无限循环,所以套接字"sock"从来不显式关闭。

然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。

*/closesocket(msgsock);return 0;}b.给出程序调试和运行的截图。

客户端服务器c.回答下列问题:(1)为什么在服务器和客户端要包含winsock2.h文件?答:因为下文的ws2_32.lib是winsock2.h头文件包含的内容。

(2)为什么在服务器和客户端程序中要加入#pragma comment(lib,"ws2_32.lib") 语句,如果不加会出现什么问题?答:这个语句表示链接到Ws2_32.lib这个库,如果不加,就不能正确链接,也就不能使用Ws2_32.lib这个库的内容了。

(3)为什么在服务器和客户端程序中要使用WSAStartup函数,如果不用程序会有什么问题?答:WSAStarup,是Windows SocKNDs Asynchronous的启动命令、Windows下的网络编程接口软件Winsock1 或Winsock2 里面的一个命令,我们需要通过WSAStartup函数完成对Winsock服务的初始化,若不用此函数,Winsock服务无法初始化,从而影响程序的运行。

(4)如果先运行客户端程序,程序会有什么现象,为什么会有这一现象?答:如果先运行客户端程序,则会显示无法连接到服务器。

有这一现象的原因是服务器没运行,客户段无法寻找到对应IP的服务器。

(5)如果服务器程序所在计算机没有连接网络,程序会发生什么错误?我们捕获到什么错误信息?答:如果服务器程序所在计算机没有连接网络,则会显示不能建立连接(Can not creat connect)。

因此我们做这个试验的时候一定保持电脑是连网状态。

(6)上述服务器是串行处理多个客户端的请求,如何该成并发处理的服务器?答:用户进程调用accept,然后调用fork,这样,已连接套接口就在父进程与子进程间共享,一般来说,接下来便是子进程读、写已连接套接口并关闭侦听套接口,而父进程则关闭已连接套接口。

5.实验小结:①刚开始对于socket编程不是很了解,所以在运行程序及调试程序的过程中存在很多的问题,比如看不懂程序中某段代码的意义,不清楚程序的轮廓。

相关文档
最新文档