时间:2022-09-14 04:23:33
摘 要 Linux作为当今发展最快的操作系统,凭借着其稳定,功能强大,可定制性高的优点,正迅速成为各大企业的宠儿。本文介绍如何在Linux环境下设计一款a电信渠道终端系统,模拟实现联通营业厅的多种服务,并着重介绍了该系统服务器的实现技术。
【关键词】Linux 共享内存 线程池 接口设计
在数字网络信息一体化的今天,网络通信技术有了飞速的发展。最引人关注的便是电信运营商所主导的网络通信服务,正潜移默化地影响着每个人的生活。了解通信技术也显得尤为重要。
本文将针对两个进程间通信模式之一的客户-服务方式来介绍如何设计电信渠道终端系统实现进程间的通信。将系统分为客户端和服务器两部分,并分别阐述其设计思路以及两者的接口设计,着重介绍服务器的实现技术。
1 客户端设计思路
客户端是利用图形界面软件QT设计而成,其结构示意图如图1所示。
主要包括以下几个模块:
发送模块:将发送数据包缓冲内的数据通过SOCKET发送出去,并确认服务器已经收到;如果规定时间内没有回复,则进行重发。如果发现SOCKET错误,则通知UI交互层处理。
接收模块:从网络上接收数据包,并存放进接收数据包缓冲,进行包体解析。如果发现SOCKET错误,则通知UI交互层处理。
UI交互层:完成用户业务操作,获取用户输入,并将接收到信息显示到UI给客户看由UI进程负责整个客户端的框架初始化和复位。
2 服务器设计思路
服务器是用C语言编写,分为前置接入服务器和后置业务应用服务器。
2.1 逻辑结构
其结构示意图如图2所示。
从客户端接收数据模块:通过SOCKET接收从客户端发来的数据包
包体解析校验模块:检验包体的完整性以及包体数据的完整性,若完整则将需要的相关数据存入共享内存1中,否则通知客户端重新发送数据包。
线程池:从共享内存1中接收到数据,根据数据中的任务编号将对应任务添加至线程池等待执行。
任务处理模块:包含充值缴费、余额查询、账单查询、详单查询、买电子卡等业务流程,当线程池执行相应任务时,从数据库中查询所需要的数据内容再存储到共享内存2中。
发送数据模块:从共享内存2中获取到响应的数据,封装成包体,通过SOCKET发送回至客户端。
2.2 主要技术应用
2.2.1 基于TCP的SOCKET编程
编程步骤如下:
第一,调用socket函数来创建通讯所需的流式套接字。
第二,调用bind 函数将所创建的套接字绑定到一个指定的本地地址及端口上。
第三,调用listen函数来设置套接字为监听的模式。
第四,调用accpet 函数,阻塞等待客户端请求,一旦有客户端请求到来,它会创建一个对应于此连接新套接字,随后就用这个套接字与指定的客户端进行通信。
第五,调用recv和send 函数与客户端进行数据通信。
第六,通信完成后调用close 函数来关闭套接字,然后回到第四步。
第七,在服务器端程序关闭前调用close 函数关闭监听套接字。
2.2.2 进程间通信-共享内存
所谓共享内存,就是由IPC为一个进程所创建的一个特殊的地址范围,它将出现在进程的地址空间中。共享内存是允许两个或多个不相关的进程去访问的同一部分逻辑内存。如果一个进程向这段共享内存写了数据,所做的改动会立刻被有权访问同一段共享内存的其他进程看到。
电信渠道终端系统服务器中创建了两块共享内存,一块负责存放前置服务到业务应用服务的数据,另一块则是负责存放业务应用服务查询完数据库后回复前置服务的数据内容。之所以才有共享内存通信,其中一个好处就是其效率高,因为进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时再重新建立共享内存区域;而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是解除映射时才写回文件的。
2.2.3 线程池
线程池是预先创建线程的一种技术。线程池在任务还没有到来之前,创建一定数量(N)的线程,放入空闲队列中。这些线程都是处于阻塞状态,不消耗CPU,但占用较小的内存空间。
当新任务到来时,缓冲池选择一个空闲线程,把任务传入此线程中运行;如果缓冲池已经没有空闲线程,则新建若干个线程。当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源。
由于电信渠道终端系统面向的是万级以上的用户连接,会有大量的电信业务需要处理,这样会造成系统创建大量线程而导致消耗完系统内存以及”过度切换”,所以使用线程池能有效地减少在创建和销毁线程上所花的时间以及系统资源的开销。
3 客户端与服务器接口设计思路
3.1 接口方案
采用TCP长连接方案,在交易或开机过程中维持连接。
数据包报文总体格式:
包体信息头的数据结构:
typedef struct head_package_t
{
int packet_size;
int packet_sum;
int packet_seq;
int fun_id;
int test_type;
}head_package;
3.2 部分数据包包体接口
(1)一卡通充值(功能号:1001)见表1。
(2)余额查询(功能号:2001)见表2。
4 结束
Linux下用C及C++所实现的电信渠道终端系统性能稳定,运行效果良好,成功模拟实现了营业厅的各类业务服务,虽然仅是进程间的通信数据处理,但对于网络数据通信有着启发意义,为网络通信提供了一个很好的学习范例。
参考文献
[1]梁明刚,陈西曲.Linux下基于epoll+ 线程池高并发服务器实现研究[J].武汉工业学院学报,2012,31(3):55。
[2]黄茹.浅析Linux环境下的进程间通信机制[J].科技信息,2014(14):97。
作者简介
游昌斌(1993-),男,福建省平潭县人。现为福州大学物理与信息工程学院电子信息工程专业2012级本科生。
李志伟(1993-),男,福建省平潭县人。现为福州大学物理与信息工程学院电子科学与技术专业2012级本科生。
作者单位
福州大学物理与信息工程学院 福建省福州市 350100