研究管理代理与监控模块通信设计
。
(3)监控信息组织就是提供安全高效的数据存储结构,能够完整地记录所有监控信息。
3.3内存映射文件存储数据结构设计
为了能存储完整的变量结构信息,可将监控信息的逻辑存储结构设计为如图1所示。在监控信息的逻辑结构中存在两种结构指针,即横向指针表示父子关系和纵向指针表示兄弟关系,由此而构成了一棵二叉树。
本文原文
在图1所示结构中,由于不同变量类型存储大小不同,从而导致二叉树中各个节点的大小不统一。为了方便地进行存储空间管理,同时又能准确完整地记录如上变量结构信息,笔者设计了一套内存映射文件的存储数据结构。其基本思想为:将数据本身与数据间的逻辑关系分开进行处理,每次根据实际使用的需要在文件空闲空间中分配相应大小的空间,并在该空间的起始位置生成一个空间信息记录。其中包括存放的变量类型、变量大小、变量指针、结构指针等数据信息。此外还包括了该空间的地址、前后相邻区域地址、本空间大小等空间管理信息。真正的记录数据实体存放在该空间信息记录之后的剩余空间中(剩余空间的大小可以是不同的)。文件的存储结构如图2所示。
由图2可以看出,在监控信息存储文件中所有的存储空间均是前后紧连着的。通过空间信息记录可以得知某区域的大小以及是否正在被使用。这样就能够方便地进行空间分配和回收工作。又因为在空间信息记录中存在变量结构指针,因而通过空间信息记录也能方便地访问到数据之间的逻辑结构关系。由此看出,空间信息记录在整个存储设计中占有很重要的位置,正是利用它才实现了对存储空间的灵活使用。空间信息记录的数据结构设计如下:
typedef struct TItemInfo
{//以下为数据(变量)信息
char NodeName[MAX_NODENAME];//节点名
char NodeInfo[MAX_NODEINFO];//节点信息
int NodeType;//1:程序节点;2:类节点;3:变量节点;其他未定义
int VarType;
//存储数据的变量类型,特别:程序节点存储了句柄信息,long型
int VarSize; //数据大小
bool Writable; //变量是否可写
void *VarAddr; //数据在程序中的地址
void *PBrother; //前一个同级(兄弟)节点
void *NBrother; //下一个同级(兄弟)节点
void *Father; //父亲节点
void *Child; //下一级(孩子)节点
//以下为空间管理信息
void *Addr; //本区域在文件中的相对地址
long ItemSize; //本区域大小
void *PAddr; //前一个区域在文件中的相对地址
void *NAddr; //后一个区域在文件中的相对地址
bool InUse; //本区域是否正在使用
}TItemInfo;
4关键技术及其具体实现
4.1命令转发
管理代理接收到的命令有查询被监控应用程序状态、刷新监控变量、锁定监控变量、锁定应用程序窗口等。管理代理根据UDP报文内容,将命令发送给指定的监控模块。命令的转发均是通过自定义消息实现的。本文使用Windows消息机制自定义了一系列消息并实现其消息的处理,结合到本监控系统的需要,管理代理中主要定义了如下消息及其处理:
(1)WM_READAPPHANDLE:读应用程序实例中监控模块的相关句柄;
(2)WM_READAPPSTRUCT:读应用程序实例中的MIB子树结构;
(3)WM_READAPPDATA:读应用程序实例中的MIB节点的值;
(4)WM_SETAPPDATA:设置应用程序中的MIB节点的值;
(5)WM_READAPPTRAP:读应用程序发送来的Trap信息;
(6)WM_READPROXYSET:为应用程序实例的MIB子树中某个MIB节点设置阈值;
(7)WM_MIBERROR:代理与应用程序之间的通信发生错误。
由于在一个标准的Windows应用程序中,消息是由窗口处理的,而在管理代理中没有窗口,也不是从窗口继承的一个类,管理代理不能直接进行消息操作。在程序中使用Allocate-HWnd函数为监控模块虚拟生成一个消息窗口,专用来进行消息捕获、发送与处理。
4.2内存文件映射与同步机制
4.2.1内存文件映射实现管理代理与监控模块之间通信
管理代理与应用程序实例的监控模块之间的数据交换采用内存文件映射这种进程间的通信方式。管理代理的文件映射和文件映射视图的创建代码如下:
HANDLE h_filemap; //内存文件映射句柄
HANDLE h_LocalMapView; //内存文件映射视图句柄
//创建内存文件映射对象,有读写权限,对象名为ProxyFileMap
h_filemap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, VIEWSIZE, "ProxyFileMap");
if (h_filemap==NULL)
{AfxMessageBox("Create Local File Map Error!");
return false;}//创建内存文件映射视图
if((h_LocalMapView=MapViewOfFile(h_filemap,FILE_MAP_ALL_ACCESS,0,0,0))==NULL)
{AfxMessageBox("Create Local Map View Error!");
return false;}
管理代理启动后,在其内存文件映射视图中写入自己的窗口句柄,供各个应用程序实例读取。监控模块初始化时,从管理代理的内存文件映射视图中得到管理代理的窗口句柄,向管理代理的内存文件映射视图中写入自己的内存文件映射对象名,并发送请求注册消息给管理代理。管理代理收到消息后,从自己的内存文件映射视图中读出应用程序实例的内存映射文件对象名,创建应用程序实例内存文件映射视图[9]。代理和监控模块的通信通过读写内存文件映射视图和互相发送消息实现。
4.2.2同步机制
管理代理和监控模块通过对内存映射文件进行读操作和写操作来完成数据交换。由于存在多个独立的应用程序实例进程,它们可
Tags:
上一篇:现今电信发展的趋势与挑战探析下一篇:探析电信级以太网技术