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 If you are using sh, you can set it like: export LD_LIBRARY_PATH= (2) You MUST put /usr/local/ns-allinone-2.35/tcl8.5.10/library into your TCL_LIBRARY environmental variable. Otherwise ns/nam will complain during startup. After these steps, you can now run the ns validation suite with cd ns-2.35; ./validate For trouble shooting, please first read ns problems page http://www.isi.edu/nsnam/ns/ns-problems.html. Also search the ns mailing list archive for related posts. (4)设置环境变量 Linux环境中设置环境变量有三种方式,临时设置,当前用户设置,系统坏境变量设置。在此处仅设置当前用户坏境变量。具体步骤如下:

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

本文来源:https://www.bwwdw.com/article/v1g7.html

Top