1、三、实验要求:1按照实验内容和步骤完成各个实验;2在实验报告中要有详细地实验步骤以及结果;3. 按时上交实验报告。四、实验步骤1工程创建在VC6中新建一个新工程,选择:Win32 Console Application,输入工程名。具体方法:启动VC6.0,单击【File】-【New】,如图1所示;图1(1)服务器端创建:然后在【新建工程】的对话框中的【Projects】选项卡中选择:Win32 Console Application,输入一个工程名及保存路径,点击【确定】,如图2所示;图2(2)客户端创建:在【新建工程】的对话框中的【Projects】选项卡中选择:MFC AppWizard
2、exe,输入一个工程名及保存路径,点击【确定】,选择“单文档模式”,完后确定完成,如图3所示,完成后新建一个主界面窗体,如图4所示。图3图42Winsock初始化在Windows环境下进行网络程序设计时,所有的Winsock函数都是从ws2_32.dll导出的,我们可以通过#pragma comment(lib, ws2_32.lib)语句链接到该库文件。但在使用Winsock函数之前还必须调用WSAStartup函数对库资源进行初始化工作,使用完毕后,在退出程序之前,我们还必须调用WSACleanup函数来释放库资源。为了便于程序的设计,我们先设计一个CInitSock类来管理WinSock
3、库。在工程中添加新类的过程步骤如下: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_A06
4、7_29100702ACE8_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER #pragma comment(lib, )#include winsock2.hclass CInitSock public: CInitSock(); virtual CInitSock();#endif / !/ InitSock.cpp: implementation of the CInitSock class. /InitSock.h/ Construction/DestructionCInitSock:CInitSock() WSADATA
5、 wsaData; WORD sockVersion = MAKEWORD(2, 2); if(:WSAStartup(sockVersion, &wsaData) != 0) exit(0);CInitSock() :WSACleanup();然后在工程中新建一个.cpp的源文件,在这个源文件中填写主函数代码,并且在这个.cpp源文件的开始部分包含如下头文件:”initSock.h”和”stdio.h”,还申明一个CInitSock类对象,具体代码可如下所示:stdio.hCInitSock initSock; / 初始化Winsock库,对库资源进行初始化工作,释放资源3.编程模式(1)服
6、务器端:函数具体说明请参考MSDN或者讲义或者教材。1)创建socketSocket函数的原型为:SOCKET socket(int family, int type, int protocol);创建一个流式套接字可以如下所示:SOCKET _socket=socket(AF_INET,SOCK_STREAM,0);创建一个数据报式套接字可以如下所示:SOCKET _socket=socket(AF_INET,SOCK_DGRAM,0);注:在面向TCP的应用中我们应该创建一个流式套接字。2)绑定bindbind函数的原型:int bind (SOCKET sockfd, const str
7、uct sockaddr *myaddr, socklen_t addrlen)绑定是将一个套接字和一个套接字地址绑定在一起,在调用bind之前还必须设定服务器地址。如下可以设定一个服务器地址:sockaddr_in serverAddress; /定义地址结构体serverAddress.sin_addr.S_un.S_addr= inet_addr(192.168.1.107); /服务器ip地址serverAddress.sin_family=AF_INET;serverAddress.sin_port=htons(6000); /服务器端口,例如使用6000下面的语句将套接字和地址se
8、rverAddress绑定在一起:bind(sockSrv, (SOCKADDR*)& serverAddress, sizeof(SOCKADDR);htonlhost to network long,就是把主机的字节顺序转化成网络上的字节顺序,参数为long int型;同理htonshost to network short,只不过参数为short int型。地址族必须为AF_INET,端口为6000,绑定的ip地址也可以用INADDR_ANY代替,表示可以用本机的任何IP地址。bind命令绑定本地刚才创建好的socket。格式如上。3)监听listenlisten函数的原型为:int l
9、isten(SOCKET sockfd, int queue_length);如下语句可以对一个套接字sockSrv进行监听:listen(sockSrv,5);4)接受连接accept,接收/发送数据send/recvsockaddr_in addrClient;int len=sizeof(SOCKADDR);char sendBuf = “TCP Server Demo!rn”;SOCKET sockConnect=accept(sockSrv, (SOCKADDR*)&addrClient, &len); /接受客户端连接if(sockConnect = INVALD_SOCKET)
10、/如果连接不成功 printf(“Failed accept!”); continue;printf(接受到一个连接:%s, inet_ntoa(addrClient.sin_addr); /显示客户端的IP/关闭连接套接字,终止通信closesocket(sockConnect);inet_ntoa函数转换Internet网络地址为点分十进制格式。5)发送/接收数据send/recvsend(sockConnect,sendBuf,strlen(sendBuf)+1,0); /发送数据recv(clientSocket,recvBuffer, strlen(recvBuffer),0); /
11、接收数据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(/表示连接服务器的IPaddrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);3)向服务器提出连接请求:int con;con = connect(clientSocket,(SOCK
12、ADDR*)&addrSrv,sizeof(SOCKADDR);/连接服务器if(con != 0) /连接服务器失败cannot connect to servernreturn 0;4)连接成功后,接收服务器端发送来的信息char recvBuf100;int nRecv;nRecv = recv(clientSocket,recvBuf,100,0); /接收服务端的数据if(nRecv 0) recvBufnRecv = 0;接收到的数据:%sn,recvBuf);5)关闭套接字,终止通信closesocket(sockClient);4.项目简单演示1)开启服务器端,等待客户端连接2
13、)开启客户端,可以开启多个,为了达到效果,可以再不同的机器上开启客户端3)在客户端上点击“LINK”按钮,连接服务器。4)开始聊天,只要连接上服务器的客户端都会收到聊天信息,相当于简单的群聊。五、实验报告1完成本项目实验后,学生应提交实验报告。2实验报告格式与要求见附件。实验2NS2网络仿真实验1) 学生能够初步掌握NS2网络模拟平台,并且能够利用网络模拟平台进行简单的实验。2) 学习采用距离矢量算法(Distance Vector Algorithm)的动态路由。3) 加深对TCP 拥塞控制与流量控制机制的理解,并且能够为实验需要简单修改NS2 的核心模块。本实验分为三个实验过程,NS2平台
14、的坏境搭建、NS2网络路由协议的仿真以及要简单修改NS2 的核心模块。此外,在实验过程中需要同学们自学linux操作系统的安装和使用(可在虚拟机中安装linux,本实验指导书使用的VMware虚拟机中的ubuntu操作系统),熟悉linux下的软件开发过程(如vi编辑器,gcc编译器),熟悉Tcl和Otcl脚本语言,熟悉C+编程语言。三、实验要求1了解NS2的基本原理2熟悉Tcl和Otcl脚本语言3. 熟悉NS2的解不了模块4. 根据实验指导书搭好实验必需的坏境1NS2坏境搭建(1)点击下载ns2的最新版本ns-allinone-2.35, 并解压到对应目录下。(也可以用命令解压:tar zx
15、f ns-allinone-2.35.tar.gz 如果想看解压的输出过程:把zxf改为zxvf)。例如:$ 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的文件夹中)(2)下载并安装下一步ns-2.35时所必需的软件包:$ sudo apt-get install build-essential$
16、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 分
17、钟之后大概出现如下提示:(不要关闭终端)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/unixinto your PATH environment; so that youll be able to run itm/tclsh/wish/xgraph.IMPORTANT NOTICES:(1) You MUST put /usr/local/ns-allinone-2.35/otcl-1.14,
18、/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=预设
19、队列的长度) n=0; isdrop=false; else 数据包入队; /丢数据包入列(3)修改drop-tail.cc 函数enque,具体代码图2 所示(4)动画演示与验证a.开始发生丢包,图3 所示。图3 开始发生丢包b.清空队列,把队列中的数据发送完再接受新的数据,图4 所示。图4 清空队列c.节点0 停止发送数据包,如5 所示。图5 节点0 停止发送数据包d.节点1 停止发送数据包,如图5 所示图5 节点1 停止发送数据包e.节点3 停止发送数据,如图6 所示,整个仿真也将结束。图6 节点3 停止发送数据f.通过实验演示得到了预期的实验结果,即一旦发生丢包后,节点会等到队列中的数据发送完后才会接受新的数据包。实验3ip数据包捕获
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1