创建一个数据报式套接字可以如下所示:
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