2024年4月2日发(作者:)
MicrocomputerApplicationsVol.27,No.2,2011
文章编号:1007-757X(2011)02-0021-02
研究与设计微型电脑应用2011年第27卷第2期
载波设备网管中高性能网络通信的模块设计
王斌,姜元建,徐伟
摘要:以载波设备网管系统的开发为背景,利用windows操作系统提供的端口技术,给出了载波设备网管中网络通信模块
的设计方案,该方案采用线程池、对象池等多种系统优化技术。网络通信模块以动态库输出函数方式为上层应用提供网络服
务。
关键词:设备网管;完成端口;通信模块
中图分类号:TN915文献标志码:A
0引言
载波设备网管是指安装于调度局端,运行于windows
操作系统之上的一套面向载波网络进行监控的专业软件系
统,它由图形应用、数据库应用和前置通信应用等若干模块
构成,能够实现对载波设备参数配置、查询以及运行状态监
测等各种功能。
前置通信软件与安装在各个变电站中的载波通信管理
机通过网络进行通信,实现对载波设备的监控及数据采集。
载波通信管理机作为通信的发起方,主动与前置软件建立
TCP连接,完成数据的上传和下发,一个完整的载波监测系
统结构如图1所示。
要实现一个高性能网络通信模块,比较简单方式是采用
并行化模型,即一个线程等待客户连接,当客户请求到达时,
该线程创建新的工作线程去处理客户请求。这种模型减轻了
实际开发的复杂度,每个独立线程都能很快的对每个新到达
的客户请求进行处理。但随着客户请求数量的不断增多,工
作线程的数目会越来越多,而创建和销毁大量线程所花费的
时间和消耗的系统资源是巨大的,同时也会加重线程调度的
负担,浪费许多宝贵的CPU时间。
IOCP是Winsock2中引入的一个高效复杂的内核对象,
该对象通过创建指定数量的线程对重叠I/O操作进行处理。
其实可以简单地把IOCP看成是系统维护的一个队列,操作
系统把重叠I/O操作完成的事件通知放入该队列,由于是暴
露操作完成的事件通知,所以命名为“完成端口”。一个
socket被创建后,可以在任何时刻和一个IOCP进行关联,
此后,在该socket上进行的重叠I/O操作均使用此IOCP发
出通知,由工作线程来处理相应的消息。IOCP机制的工作
原理如图2所示。
重叠I/O
阻塞
的工
GetQueuedCompletionStatus
应
用
完成包
作线
程队
列
先进
先出
完成
包队
列
I/O系统
完成端口(IOCP)
图1载波监测系统结构
图2IOCP工作原理图
从图1中可知,前置通信软件在载波设备网管中起着承
上启下的作用,必须谨慎设计才能保证系统良好的运行,因
此,采用分层的思想来设计,将前置通信软件分成逻辑处理
层和网络通信层,其中,网络通信层作为核心模块,主要功
能接受并发连接、网络数据包、暂存和发送逻辑层的逻辑数
据包。在载波设备网管中,网络通信模块采用了windows
操作系统提供的完成端口(IOCP)技术,以动态库输出函数方
式为上层应用提供服务。
从图2中可知,一个应用可以预先创建多个工作线程来
处理完成端口上的通知事件,这些线程处于堵塞状态,系统
将应用发出的重叠I/O操作完成事件投递到一个队列中,事
先开好的线程逐一从该队列中取出完成包并加以处理。对于
处理大量并发异步I/O请求的操作来说,相比于在I/O请求
发生时创建线程而言,这样不光能够避免频繁地创建线程和
销毁线程,而且用数目很少的线程就可以处理大量客户端并
发请求,大大提高了线程和CPU利用率。
1完成端口的机制
2通信模块的设计
———————————
作者简介:王斌(1977-),男,南京,国网电科院南瑞集团信通分公司,工程师,硕士生,主要研究通信、网管,江苏南京211106
姜元建(1973-),男,南京,国网电科院南瑞集团信通分公司,工程师,本科,主要研究通信、网管,江苏南京211106
徐伟(1980-),男,南京,国网电科院南瑞集团信通分公司,工程师,硕士生,主要研究通信、网管,江苏南京211106
21
MicrocomputerApplicationsVol.27,No.2,2011研究与设计微型电脑应用2011年第27卷第2期
2.1基于IOCP的总体设计
网络通信模块需要提供开启/关闭网络服务、管理客户
端连接列表、管理未决的接受请求列表、发出异步操作等基
本的网络通信功能,利用完成端口机制进行网络模块设计,
主要就是完成初始化网络系统、创建完成端口、创建监听线
程和工作者线程来实现这些功能,同时提供输出函数为上层
应用提供用户接口,其总体架构如图3所示。
监听线程负责投递一定数量的AcceptExI/O操作,并且
将这些投递的操作记录在一个链表里,通过调用getsockopt
函数,检查连接建立的时间,如果超过规定的时间,则关闭
这个连接,以避免恶意客户连接。当已投递的I/O用到低于
一定数量的时候,再重新投递一定数量的AcceptExI/O操
作。
工作线程负责处理完成的重叠I/O操作,将从IOCP上
读取的接受数据或者连接请求通过用户接口通知上层逻辑
应用模块进行处理,当上层逻辑应用模块有数据需要发送的
时候,同样调用用户接口,将数据投递到IOCP上。
图3通信模块总体架构
2.2用户接口
以网络通信模块通过动态连接库的方式为应用系统提
供了如下接口函数:
1、网络初始化接口:为上层应用提供注册回调函数服
务,该回调函数用于处理客户端新连接、客户端断开连接、
连接出错、接受完数据和发送完数据等消息,通过设置回调
函数,可以使上层应用根据需要来处理相应的消息,实现自
己的逻辑应用功能。
2、建立完成端口接口:通过指定端口号,创建完成端
口,开启服务端功能。
3、数据发送接口:调用该函数,实现向客户端发送数
据的功能。
4、关闭客户端接口:通过指定相应客户端号,服务端
可以强行关闭与该客户端的连接。
5、连接服务端接口:通过该函数,可以实现主动连接
其它服务端的功能。
6、注销网络接口:通过该函数,关闭完成端口,终止
2.3关键技术
2.3.1池技术
在完成端口的设计中,“池”(POOL)几乎是必须采用
的原则。这里的“池”可以包含内存池、连接池、线程池等
多个方面。
在每一次投递WSASend或WSARecv操作时,都要传
进一个重叠结构体参数。可以提前建立一定量的重叠结构体
空间,并将其统一放入一个空闲队列中,当发起异步I/O操
作时,需先从空闲队列里取一个结构体空间来用,用完之后
并不直接销毁,而是再将其放回空闲队列以便以后重复利
用,这就是内存池技术的使用。
当服务器使用传统的accept接收客户端的一个连接后,
此函数会返回一个创建成功的客户端socket。在WinSock2
提供一个接受扩展函数AcceptEx时,它允许在接受连接之
前就事先创建一个socket,使之于接受的连接相关联。在调
用AcceptEx时可以直接把这个已经创建好的socket传给
AcceptEx。有了这个保证就可以在接受连接之前就创建一定
数量的socket等着AcceptEx来用,这就省去了临时创建一
个socket的系统开销,这就是所谓的连接池。
线程池是提高网络模块性能的一种很好技术,在网络模
块中使用的线程池主要是由完成端口对象负责维护的工作
线程池,负责投递异步I/O操作,此外,还有负责逻辑处理
的线程池,它是专门提供给应用层来使用的。
2.3.2线程同步技术
由于网络模块采用了多线程编程,所以对公共资源的保
护显得尤其的重要。为了保证多线程之间的同步,在网络模
块中采用了临界区来保护公共资源。临界区是一种防止多个
线程同时执行一个特定代码的机制,每个线程中访问临界资
源的那段程序称为临界区。
2.3.3数据发送技术
在网络模块中,为了避免冲击可分页内存锁定极限和非
分页内存极限,需要对同一个连接限制并发的I/O次数,这
里通过建立一个发送缓存队列来实现对每个连接仅允许一
个发送I/O,当WSASend未返回操作完成时,后续提交的
数据将放置于发送队列,直到WSASend完成,然后从发送
队列取出一块数据,继续发送。采用该方案还避免了在多个
工作线程存在的情况下,因为线程切换的随机性而导致对方
接收到的数据可能出现乱序的情况。
2.3.4安全关闭连接技术
在IOCP模式下,如果调用closesocket时有未决的I/O
操作将导致socket被重置,所以有时会出现数据丢失。正统
的解决方式是使用指定SD_SEND标志的shutdown函数,
当调用shutdown时,也许数据仍然停留在操作系统的缓冲
内,操作系统将在数据发送完后发出一个FIN包来启动关
闭进程,客户端接收完数据后,将接受到一个0长度的包,
以此判断连接已关闭,然后调用closesocket,这时服务器的
GetQueuedCompletionStatus将接收到一个数据长度为0的
包,这时就可以调用closesocket,并释放相关连接资源。
线程,释放相关资源。
(下转第27页)
22
MicrocomputerApplicationsVol.27,No.2,2011研究与设计微型电脑应用2011年第27卷第2期
lpMultiByteStr,intcbMultiByte,LPCSTRlpDefaultChar,
LPBOOLlpUsedDefaultChar);
WinCE还提供了语音播报的API:PlayText(char
*pcStr,intlen,intiType),通过调用这个API可以实现新
抢险消息的语音提示功能。导航功能的实现借助于导航引擎
二次开发包,通过调用SDK所提供的功能回调函数:
FARPASCAL*GUIDER_SET_DESTINATION(PSID
pShow,float_2pointfp),可以设置终点,并且触发导航事件。
这里参数fp是某一地点的经纬度。
终端接收到的各类消息都将保存到一个文件中,开机时
读取文件内容,终端UI将可以显示最近收到的20条消息。
对于服务器端发送的配置信息,将其保存到配置文件中,当
系统开机初始化时读取配置文件,初始化配置参数,如:按
时回报的时间间隔参数,按距回报的距离间隔参数,以及终
端的ID号。
而使终端能够在复杂的路况下更有效的进行导航。本文所实
现的方案已经应用于水务抢险系统中。然而,在某些极端的
情况下(如GPRS信号被屏蔽,隧道中无GPS信号等),将给
终端与服务器的通信带来困难,这些问题将成为定位导航系
统今后的主要研究课题。随着GPRS通信费用的下降以及地
图引擎的开源化如GoogleMap),该系统在汽车防盗以及远
程监控系统中将有更广阔的应用前景。
参考文献
[1]ZhenhuaZhao,WeiZhou,NaWangShippingMonitoring
SystemBasedonGPSandGPRSInformationEngineering,
'ternationalConferenceon
Taiyuan2009(07)346-349
[2]李冲,于军琪,郭春燕.基于GPS与GPRS技术的车辆监
控系统研究[J].中国西部科技,2007(07):79-80.
[3]曾兵,蒋涛.GPS在信息安全中的应用技术研究[J].信息
安全与通信保密,2007,(08):173-174.
[4]张志强,王才.基于GPS/GPRS的车辆监控系统中车载台
的设计[J].自动化与仪器仪表,2007(05):17-18.
[5]<
航空航天出版社,北京,2008.9.
[6]< 编程)>>汪兵,李存斌,陈鹏等编著[M].中国水利水电出 版社,北京,2008. (收稿日期:2010-05-27) 3结论 文介绍了一种基于GPS+GPRS的车载定位导航终端与 服务器端通信问题的实现方案,实现了终端定位,导航及与 服务器端通信的功能。在通过GPRS实现了终端Internet网 络接入功能的基础上,制订了应用层通信协议,该协议可用 于突发性强以及实时性要求高的远程监控系统中,在GPRS 网络覆盖范围内可以保证终端能够及时的接受到服务器端 发送的调度预案,从而实现服务器端对终端有效的监控。可 以将监控系统所感兴趣的地理位置信息加入地图数据库,从 (上接第22页) 4 3网络模块在前置通信软件中应用 结束语 本文依托于载波设备网管的开发,在开发中利用了完成 前置通信软件通过调用网络模块中的网络初始化接口, 注册事件处理函数,然后调用建立完成端口接口,开启服务 端功能。 当服务端接收到客户端数据后,将产生接收数据完成通 知事件,前置通信软件在事件处理函数中响应该事件,将接 收到的数据存入数据接收环形缓冲区中后返回,然后由数据 包拼包线程将其拼装成逻辑意义上完整的数据包后提交给 逻辑处理线程,该线程对此类数据包进行逻辑解析,实现前 置通信软件功能,有的数据包在处理完成后,可能还需要向 客户端返回处理结果,此时调用网络模块中的数据发送接口 将数据发送给特定的客户端。 当前置通信软件退出的时候,需要调用网络模块中注销 网络接口,关闭完成端口,终止线程,释放相关资源。 端口技术实现网络通信模块,将该模块应用于载波设备网管 前置通信软件中,有着非常好的效果。本文所提出的网络通 信模块也可以用于视频监控、环境监测等其它对性能要求较 高的应用项目中。 参考文献 [1]王瑞彪,李凤岐,施玉勋等.基于IOCP机制的网络游戏服 务器通信层的实现[J].计算机工程与应 用,2009,45(7):75-78. [2] [3] 王文武,赵卫东,王志成等.高性能服务器底层网络通信 模块的设计方法[J].计算机工程,2009,35(3):103-105. AnthonyJones,JimOhlund[美].WINDOWS网络编程 [M].2版.杨和庆,译.北京:清华大学出版社,2002. (收稿日期:2010-06-27) 27


发布评论