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]<>周立功等编著[M].北京

航空航天出版社,北京,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