基于Socket 技术的负荷分担通信系统仿真的设计
作者:任育琦 杨晴
来源:《电脑知识与技术》2013年第28期
作者:任育琦 杨晴
来源:《电脑知识与技术》2013年第28期
摘要:无线通信技术的快速发展可以说是一场新的革命。该文设计了一套考虑负荷分担的通信系统仿真,用来模拟无线通信时的负荷分担情况,该设计采用有三个节点的分配规则算法,进程间采用Socket通信及规定协议,通过Windows可执行文件来模拟进程,用C语言加以实现,并测试通信时运行良好。
关键词:无线通信;负荷分担;Socket通信
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)28-6278-06
通信技术与计算机结合,已成为集无线、有线传输、数字程控交换和各类新型终端为一体的高效能综合通信手段。
在通信网中,除了传递具体业务信息外,还在通信设备之间传递一些控制信号,而信令网就是传输这些控制信号的网络。信令网的安全措施中,广泛地使用了把信令业务分配给各信令
链的负荷分担技术。通常,在通信网中负荷分担使用以下两种方式:同一信令链路组内各信令链路间的负荷分担,用于两个信令点(包括综合型信令转接点)采用直联工作方式的信令链路之间;不同信令链路组间的信令链路的负荷分担,用于一个信令点连接两个信令转接点和信令转接点间不同信令链路组之间采用准直联工作方式。目前信令链路的费用较低,为了提高信令链路的可靠性,应尽可能不采用不同链路组间的信令链路负荷分担方式。
本文设计了一套考虑负荷分担的通信系统仿真,用来模拟无线通信时的负荷分担情况。
1 Socket通信
1.1套接字(Socket)基本概念
套接字是进行程序间通信的一种方法,同时是通信的基石。套接字是支持TCP/IP协议的网络通信的基本操作单元,可以将套接字看作不同主机之间的进程来进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般线程通过套接字通信而引进的一种抽象的概念。套接字通常和同一个域中的套接字进行数据交换。各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
1.2 Socket通信原理
Socket在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输、接收的信息都通过这个Socket接口来实现。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读、写操作。同时,Socket可以看作网络通信的一个端点,网络通信包括两台主机或两个进程,通过网络传递数据。网络对话的每一端称为一个端点。当使用Socket接口对网络通信编程时,Socket是网络通信过程中端点的抽象表示。为了通过Socket接口进行网络通信,程序在网络对话的每一端都需要一个Socket。
本文采用流式Socket(SOCK_STREAM)通信方式:在这种方式下,两个通讯的应用程序之间先要建立一种虚拟的连接,提供可靠的、面向连接的通信流,从而保证数据传输的正确性和有序性。
2 负荷分担通信系统仿真平台的设计
2.1 系统总体设计
系统整体包括总控端、负荷端和测试端三大部分。如图1所示,该系统用来模拟实现总控端的负荷分配和负荷端的数据处理。为了分担总控节点的处理负担,系统中适当增加一些负荷节点来分担总控节点的处理任务,总控节点除了记录当前接入用户总数、负荷节点的处理用户数等一些基本操作外,其完全可以将所有权利下放,起到一个合理分配任务的作用。负荷节点由总控节点进行支配,与总控节点充分协作,完成所需功能。而用户通过测试端进行用户接入、释放等自定义测试,也可以通过测试端进行测试用例的整体测试。重点就是要测试总控节点是否合理分配了任务,以及总控节点和负荷节点的协调性是否合理,一致(包括总控节点和负荷节点数据是否同步)。
系统中传送的消息结构体有两类,具体如下所示:
1) typedef struct users
{
char bussy ;//用于标示监听端发送到客户端的数据开始
int userID;//保存用户ID
int PINodeID;//保存负荷节点号
int PINodeP;//用于保存节点端口号
char cmd;//传送的命令
int PINodeUsers;//节点上的用户数目
} USER, *pUSER;
users结构体是主要消息载体,用于用户与总控节点,总控节点与负荷节点的消息传送等操作。
2) typedef struct PINode_inf
{
char flag;//消息开始标标识
int user_num;//节点上当前用户总数
int userID[MAX_ID];//节点上用户信息,节点上每一个用户的ID号
}PINode, *pPINode;
PINode_inf结构体用于负荷节点将自己的信息发送给总控节点。
2.2 层次结构
该软件平台采用分层模块化结构设计,如图2所示系统层次图,该仿真平台系统共分为42个节点,四个层次。其中层次1为三个独立的进程,分别建立三个独立工程。其他节点可以作为独立函数,进行模块化程序设计。通过相应的标号可以看出各个节点的从属关系,模拟无线通信时的负荷分担情况,其中subp节点为公共调用节点,API节点为接口函数节点,层次图中都做了特殊注明。
2.2.1 总控端
总控端主要用于建立网络通信连接,判断测试端请求命令,处理测试端请求命令,合理将任务分配给负荷节点,保证和负荷端以及测试端的通信。具体如下:
1)建立网络通信连接:发起socket连接,相当于服务器,测试端和负荷节点相当于用户端。
2)判断测试端请求命令:用户接入,用户释放,取用户数,取负荷ID。
3)处理测试端请求命令:用户接入,用户释放,取用户数,取负荷ID。
4)用户接入,合理分配给某一个负荷节点,给负荷节点发送请求接入命令。
5)用户释放,查用户分配的负荷节点,给负荷节点发送请求释放命令。
6)取用户数,查负荷节点当前处理用户数,直接返回给测试端。
7)取负荷ID,直接发送用户ID给负荷端,等待负荷端返回负荷节点ID值。
如图3所示总控节点流程图,总控端先定义变量用于套接字初始化和通讯使用,建立套接字,同时绑定端口;之后处于监听状态并等待用户连接,准备接收数据,当收到数据后,判断命令根据不同命令字进行节点信息的获取并做相应处理;最后将处理结果发回用户,当总控段端不再处于监听状态时,关闭套接字,结束进程。
2.2.2 负荷端
负荷端主要用于实现判断总控端请求命令,处理总控端请求命令,记录负荷节点状态。具体如下:
1)判断总控端请求命令:用户接入,用户释放,取用户数,取负荷ID。
2)用户接入,记录用户ID,显示当前状态。
3)用户释放,删除用户ID,显示当前状态。
4)取用户数,返回用户数,显示当前状态。
5)取负荷ID,所有负荷节点都参与查自己的用户,看是否匹配,有匹配则返回给总控端。
如图4所示负荷节点流程图,负荷端先定义变量用于套接字初始化和通讯使用,初始化显示信息、建立套接字,同时绑定端口;之后处于监听状态并等待总控节点连接,等待接收数据,收到数据后,判断接收数据中命令字符做相应处理(如:介入用户、释放用户、发送
节点信息回总控节点等);最后刷新显示,并且继续等待总控节点的连接,如果失去连接则关闭套接字,结束进程。
2.2.3 测试端
测试端主要功能是提供如下表1四个API函数,用于实现用户接入、用户释放、取用户当前接入负荷节点ID号、取某负荷节点当前处理用户数。并通过单步调试和测试用例联调等方式进行系统测试,同时提供用户的使用说明。
3 通信协议
本设计采用了自行规定的协议,如图5socket通信为什么要指定端口通信协议,测试端的用户请求接入总控端,总控端检验是否第一次接入,并发送指令给负荷端询问状态,如果负荷端准备完毕,用户接入,如果准备未完成,则返回状态字。用户请求接入后,测试端继续发送用户名,总控端记录重要信息,合理分配命令给负荷端,负荷端接到命令立即处理,处理完毕后返回状态字,这时总控端可以继续通信和处理命令,生成相应的子线程,处理失败则返回状态字。测试端用户请求通信,总控端询问负荷端是否可以通信,可以通信则等待用户通信内容,通信失败则返
回状态字。确定可以通信后,这时测试端开始发送通信内容,总控端接收到内容后进行处理,并分配内容给负荷端进行处理。内容传送完毕,测试端开始请求用户释放,总控端校验记录中是否存在当前用户,并询问负荷端状态,负荷端准备完毕,用户可以释放,关闭子线程,没准备好则返回状态字。
4 测试结果
本设计在windows操作系统下,应用VC6.0进行开发,根据被测系统的特点采用键盘输入进行相应测试,输入不同命令调用不同函数进行系统测试,如图6所示测试结果,输入小写字母c、 回车,根据提示输入用户ID号、回车,可以接入用户,如果用户ID已经存在将接入失败并提示,同时也可以直接输入c 空格、用户ID 按回车键。系统将会根据分配原则随机将用户接入相应负荷节点。与接入用户命令同样的方法输入小写r可以释放用户。如果用户不存在将提示。同理输入小写g可以获取用户所在的负荷节点号,如果输入的用户不存在将终止测试程序。输入大写G并输入负荷节点号可以获取到该节点上的用户数目,节点号不存在则将终止测试程序。如果输入小写q或大写Q将结束测试程序。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论