4-320143X1《计算机网络原理》实验指导书
更新时间:2024-05-27 08:15:01 阅读量: 综合文库 文档下载
《计算机网络》
课程实验指导书
廖志芳 编写
课程编号 320143X1 总 学 时 48 实验学时 6 课外学时 15
中南大学软件学院 2012年11月
实验1《Windows Socket编程》
实验学时: 2 每组人数: 1
实验类型: 2 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 2 (1:必修 2:选修 3:其它)
实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它)
一、实验目的
通过实验,使学生熟悉并掌握计算机Windows 编程的基本知识,进一步加深学生对课堂所学基本内容的理解,掌握基本的Windows编程技巧,通过实验使得学生能够进行一些简单的网络程序设计。
二、实验内容
1.介绍基本的Windows Socket编程技巧;
2.基于Windows Socket编程,设计并实现一个简单的聊天系统,包括客户端及服务器端。
三、实验要求:
1.按照实验内容和步骤完成各个实验; 2.在实验报告中要有详细地实验步骤以及结果; 3. 按时上交实验报告。
四、实验步骤
1.工程创建
在VC6中新建一个新工程,选择:Win32 Console Application,输入工程名。具体方法:启动VC6.0,单击【File】->【New】,如图1所示;
1
图1
(1)服务器端创建:然后在【新建工程】的对话框中的【Projects】选项卡中选择:Win32 Console Application,输入一个工程名及保存路径,点击【确定】,如图2所示;
图2
(2)客户端创建:在【新建工程】的对话框中的【Projects】选项卡中选择:MFC AppWizard[exe],输入一个工程名及保存路径,点击【确定】,选择“单文档模式”,完后确定完成,如图3所示,完成后新建一个主界面窗体,如图4所示。
图3
2
图4
2.Winsock初始化
在Windows环境下进行网络程序设计时,所有的Winsock函数都是从ws2_32.dll导出的,我们可以通过#pragma comment(lib, \语句链接到该库文件。但在使用Winsock函数之前还必须调用WSAStartup函数对库资源进行初始化工作,使用完毕后,在退出程序之前,我们还必须调用WSACleanup函数来释放库资源。为了便于程序的设计,我们先设计一个CInitSock类来管理WinSock库。在工程中添加新类的过程步骤如下:
1)在VC6.0环境中点击【insert】->【new a class】菜单;
2)在弹出的对话框中,选定class type为Generic Class,在Name输入框中输入类的名称CInitSock,然后点击确定即可。
在InitSock.h和InitSock.cpp添加代码,详细代码如下所示。 ////////////////////////////////////////////////////////////////////////////
// initSock.h // ////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_INITSOCK_H__70EFFE09_9598_4C98_A067_29100702ACE8__INCLUDED_) #define AFX_INITSOCK_H__70EFFE09_9598_4C98_A067_29100702ACE8__INCLUDED_
#if _MSC_VER > 1000 #pragma once
#endif // _MSC_VER > 1000
#pragma comment(lib, \#include \
class CInitSock {
public: CInitSock();
3
virtual ~CInitSock(); }; #endif
// !defined(AFX_INITSOCK_H__70EFFE09_9598_4C98_A067_29100702ACE8__INCLUDED_)
//////////////////////////////////////////////////////////////////////
// InitSock.cpp: implementation of the CInitSock class. // //////////////////////////////////////////////////////////////////////
#include \
////////////////////////////////////////////////////////////////////// // Construction/Destruction
//////////////////////////////////////////////////////////////////////
CInitSock::CInitSock() { WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); if(::WSAStartup(sockVersion, &wsaData) != 0) exit(0); }
CInitSock::~CInitSock() { ::WSACleanup(); }
然后在工程中新建一个.cpp的源文件,在这个源文件中填写主函数代码,并且在这个.cpp源文件的开始部分包含如下头文件:”initSock.h”和”stdio.h”,还申明一个CInitSock类对象,具体代码可如下所示: #include \#include \CInitSock initSock;
// 初始化Winsock库,对库资源进行初始化工作,释放资源
3.编程模式
(1)服务器端:
函数具体说明请参考MSDN或者讲义或者教材。 1)创建socket
Socket函数的原型为:
SOCKET socket(int family, int type, int protocol); 创建一个流式套接字可以如下所示:
SOCKET _socket=socket(AF_INET,SOCK_STREAM,0);
4
创建一个数据报式套接字可以如下所示:
SOCKET _socket=socket(AF_INET,SOCK_DGRAM,0);
注:在面向TCP的应用中我们应该创建一个流式套接字。
2)绑定bind
bind函数的原型:
int bind (SOCKET sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
绑定是将一个套接字和一个套接字地址绑定在一起,在调用bind之前还必须设定服务器地址。如下可以设定一个服务器地址:
sockaddr_in serverAddress;; //定义地址结构体
serverAddress.sin_addr.S_un.S_addr= inet_addr(\//服务器ip地址 serverAddress.sin_family=AF_INET;
serverAddress.sin_port=htons(6000); //服务器端口,例如使用6000 下面的语句将套接字和地址serverAddress绑定在一起:
bind(sockSrv, (SOCKADDR*)& serverAddress, sizeof(SOCKADDR));
htonl=host to network long,就是把主机的字节顺序转化成网络上的字节顺序,参数为long int型;
同理htons=host to network short,只不过参数为short int型。
地址族必须为AF_INET,端口为6000,绑定的ip地址也可以用INADDR_ANY代替,表示可以用本机的任何IP地址。
bind命令绑定本地刚才创建好的socket。格式如上。 3)监听listen
listen函数的原型为:
int listen(SOCKET sockfd, int queue_length);
如下语句可以对一个套接字sockSrv进行监听: listen(sockSrv,5);
4)接受连接accept,接收/发送数据send/recv
sockaddr_in addrClient;
int len=sizeof(SOCKADDR);
char sendBuf[] = “TCP Server Demo!\\r\\n”;
SOCKET sockConnect=accept(sockSrv, (SOCKADDR*)&addrClient, &len); //接受客户端连接
if(sockConnect == INVALD_SOCKET) //如果连接不成功 { printf(“Failed accept!”); continue;
}
printf(\接受到一个连接:%s\//显示客户端的IP
//关闭连接套接字,终止通信
closesocket(sockConnect);
5
inet_ntoa函数转换Internet网络地址为点分十进制格式。 5)发送/接收数据send/recv
send(sockConnect,sendBuf,strlen(sendBuf)+1,0); //发送数据 recv(clientSocket,recvBuffer, strlen(recvBuffer),0); //接收数据 6)关闭监听套接字,终止服务器
closesocket(sockSrv);
(2)客户端: 1)创建连接套接字
SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);
2)设置通信地址
struct sockaddr_in addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(\表示连接服务器的IP addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000);
3)向服务器提出连接请求:
int con;
con = connect(clientSocket,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//连接服务器 if(con != 0){ //连接服务器失败
printf(\return 0; }
4)连接成功后,接收服务器端发送来的信息
char recvBuf[100]; int nRecv;
nRecv = recv(clientSocket,recvBuf,100,0); //接收服务端的数据 if(nRecv > 0) { recvBuf[nRecv] = ?\\0?;
printf(\接收到的数据:%s\\n\}
5)关闭套接字,终止通信
closesocket(sockClient);
4.项目简单演示
1)开启服务器端,等待客户端连接
6
2)开启客户端,可以开启多个,为了达到效果,可以再不同的机器上开启客户端 3)在客户端上点击“LINK”按钮,连接服务器。
4)开始聊天,只要连接上服务器的客户端都会收到聊天信息,相当于简单的群聊。
五、实验报告
1.完成本项目实验后,学生应提交实验报告。 2.实验报告格式与要求见附件。
7
实验2《NS2网络仿真实验》
实验学时: 2 每组人数: 1
实验类型: 2 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 2 (1:必修 2:选修 3:其它)
实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它)
一、实验目的
1) 学生能够初步掌握NS2网络模拟平台,并且能够利用网络模拟平台进行简单的实验。 2) 学习采用距离矢量算法(Distance Vector Algorithm)的动态路由。
3) 加深对TCP 拥塞控制与流量控制机制的理解,并且能够为实验需要简单修改NS2 的核
心模块。
二、实验内容
本实验分为三个实验过程,NS2平台的坏境搭建、NS2网络路由协议的仿真以及要简单修改NS2 的核心模块。此外,在实验过程中需要同学们自学linux操作系统的安装和使用(可在虚拟机中安装linux,本实验指导书使用的VMware虚拟机中的ubuntu操作系统),熟悉linux下的软件开发过程(如vi编辑器,gcc编译器),熟悉Tcl和Otcl脚本语言,熟悉C++编程语言。
三、实验要求
1.了解NS2的基本原理 2.熟悉Tcl和Otcl脚本语言 3. 熟悉NS2的解不了模块
4. 根据实验指导书搭好实验必需的坏境 3. 按时上交实验报告。
四、实验步骤
1.NS2坏境搭建
(1)点击下载ns2的最新版本ns-allinone-2.35, 并解压到对应目录下。(也可以用命令解压:tar zxf ns-allinone-2.35.tar.gz 如果想看解压的输出过程:把\改为\。例如: $ tar zxvf ns-allinone-2.35.tar.gz(解压) $ sudo mkdir /usr/local/ns2(建立空文件夹) $ sudo mv ns-allinone-2.35 /usr/local/ns2(将ns2文件移动到新建的文件夹里) $ cd /usr/local/ns2/ns-allinone-2.35(转到ns2的文件夹中)
8
(2)下载并安装下一步ns-2.35时所必需的软件包:
$ sudo apt-get install build-essential $ sudo apt-get install tcl8.4 tcl8.4-dev tk8.4 tk8.4-dev $ sudo apt-get install libxmu-dev 当用apt-get更新软件包时常出现错误提示Unable to locate package update,解决方法是: 先更新apt-get #sudo apt-get update #sudo apt-get upgrade (3)输入cd 命令,转到ns-allinnone-2.35文件夹下,输入./install,进行安装。
按下回车键,同学们可以休息一会啦,这个过程大概需要5 分钟左右(具体时间关乎机器的性能),5 分钟之后大概出现如下提示:(不要关闭终端)
Please put /usr/local/ns-allinone-2.35/bin:/usr/local/ns-allinone-2.35/tcl8.5.10/unix:/usr/local/ns-allinone-2.35/tk8.5.10/unix into your PATH environment; so that you'll be able to run itm/tclsh/wish/xgraph. IMPORTANT NOTICES: (1) You MUST put /usr/local/ns-allinone-2.35/otcl-1.14, /usr/local/ns-allinone-2.35/lib, into your LD_LIBRARY_PATH environment variable. If it complains about X libraries, add path to your X libraries into LD_LIBRARY_PATH. If you are using csh, you can set it like: setenv LD_LIBRARY_PATH
9
gedit打开/home/*user*/.bashrc,分别加入下面代码:(*user*换成自己的相应目录)在. bashrc加入(根据安装完成后终端的提示来设置环境变量): PATH=\/bin:/usr/local/ns-allinone-2.35/tcl8.5.10/unix:/usr/local/ns-allinone-2.35/tk8.5.10/unix \LD_LIBRARY_PATH=\/otcl-1.14:/usr/local/ns-allinone-2.35/lib\TCL_LIBRARY=\/tcl8.5.10/library \编辑完成,source /home/*user*/.bashrc(注意前提是要用root登陆,不然的话输入$sudo -s,以root角色登陆。) source命令是把文件中的命令执行一次的意思。
(5)验证安装
在重启后的终端中输入ns命令,出现%,说明安装成功,如图所示:
2.NS2网络协议仿真
这个实验主要是观察链路状态发生变化时,使用静态路由和动态路由的差异性。实验的结构如图1所示,节点n0会使用ftp将数据传送到n5,传送时间为0.1s~3.0s,在1.0s时,链路n1到n4发生问题,所以数据无法从n1到n4之间的链路传送。在2.0s时,链路n1到n4问题解决,数据有可以从此路传送。
图1 网络拓扑结构
TCL程序:
10
11
静态路由执行方法 1、运行TCl脚本
2、运行Nam程序,观察结果
(1)使用静态路由,传送数据从n0到n5的路径是n0----n1----n4---n5.如图2-1
图2-1
图2-2
12
(2)在1.0s时,n1到n4链路发生问题,因为使用静态路由算法,路由表不会更新,所以数据无法发送到n4. 如图2-2
(3)在3.0s时,n1到n4链路的问题得到解决,所以数据又按路径n0----n1----n4---n5传送到n5. 如图2-3
图2-3
动态路由执行方式 1、运行TCL脚本
2、运行nam程序,观察结果
(1)因为使用动态路由方式,所以一开始,节点与节点之间必须互换信息,以建立路由表,如图3-1
图3-1
图3-2
(2)路由表建立后,数据传送的路径是n0----n1----n4---n5.如图3-2
(3)在1.0s时,n1到n4链路发生问题,因为使用动态路由算法,所以节点互相通信,因此n0到n5数据发送的路径更新为n0----n1----n2---n3----n5. 如图3-4
13
图3-3
图3-4
(4)在3.0s时,n1到n4之间的链路恢复,节点互相通信后,路由表更新,因此n0到n5
数据发送的路径也恢复为n0----n1---n4----n5.如图3-5
图3-4
3.修改NS2核心模块
(1)预设实验结果:修改队列的丢包策略,当接收队列中未丢包,数据包正常入队列,一旦出现队列丢包现象,则暂停接受数据包,一直到队列为空再接受。
(2)在NS-2 核心模块中找到队列的丢包模块(在ns-allinone-2.35/ns-2.35/queue 路径下)
a.修改drop-tail.h 文件,在类DropTail 中添加一个布尔变量isdrop(初始值为
false),用于判断队列是否已经发生丢包,再添加一个int 型变量n(初始值为0)用于记录发生丢包时不接受包的个数。
b.在入队函数enque 中,判断如下: if(如果发生队列已满) { 14
附件
1.实验报告封面
《XXXXX(课程名称)》 实验报告 项目名称 专业班级 学 号 姓 名 实验成绩: 批阅教师: 年 月 日
2.实验报告正文要求
实验1《XXXXX(项目名称)》
实验学时: 实验地点: 实验日期:
一、实验目的
指出此次实验应该达到的学习目标。 二、实验内容
指出此次实验应完成的任务。 三、实验方法
25
包括实验方法、原理、技术、方案等。 四、实验步骤
指出完成该实验的操作步骤。 五、实验结果
记录实验输出数据和结果。 六、实验结论
对实验数据和结果进行分析描述,给出实验取得的成果和结论。
注:有程序的要求附上程序源代码,有图表的要有截图并有相应的文字说明和分析 七、实验小结
给出本次实验的体会,如学会了什么,遇到哪些问题,如何解决这些问题,存在哪些有待改进的地方。
26
正在阅读:
寻乐中的发现作文700字07-10
2022年第二军医大学北京军区总医院347心理学专业综合之心理与教04-06
系统化健康教育对提高高血压患者自我管理疾病能力效果观察03-18
打水漂儿01-02
中国残疾人社会保障制度现状及完善策略05-22
掘进机电气系统说明书(上海创力160)03-01
2018年6月浙江省学业水平考试化学试题(word版,含答案)10-22
三年级暑假实践作业(1)01-30
职业与人生复习题06-28
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 指导书
- 计算机网络
- 原理
- 实验
- 320143
- 楼控BA控标文件
- 小学二年级语文下册第一单元重点知识点复习
- 《学会感恩》主题班队会教学实录
- 七年级生物下册 第二章《爱护心脏 确保运输》2.2.1 血管的作用教
- 八年级物理下册 8 - 3 摩擦力教案(新版)苏科版
- 4-2 北京市住院病案首页疾病诊断名称与代码标准V5.0版本
- 中考数学压轴题精选精析(81-90例)
- 关于申请调整xxx棚户区改造项目土地用地性质的请示
- 电链锯结构常用术语
- 第三部分-综合应用(30分ghb)
- 七管超外差调幅收音机、、
- 五年级上册科学计划、教案
- ANSYS 14.5功能亮点
- 复合材料成型工艺与特点
- 管理信息系统
- 东南大学导师目录
- 学位论文-—勾股定理的无字证明勾股定理16种证明方法
- 2018年浙江杭州上城区中考数学二模试卷
- 山东省即墨市2016高考英语二轮复习书面表达选编(2)
- 市政道路管网基础设施建设项目可行性研究报告