搜索
您的当前位置:首页正文

基于VC_的网络实时通信系统的设计与实现

来源:小奈知识网
第19卷 第5期 四川理工学院学报(自然科学版) Vol.19 No.5

JOURNAL OF SICHUAN UNIVERSITY OF

2006年10月 SCIENCE & ENGINEERING(NATURAL SCIENCE EDITION) Oct.2006

文章编号:1673-1549(2006)05-0066-04

基于VC++的网络实时通信系统的设计与实现

丁 忠,孙志宏,雷跃云

(四川理工学院电子与信息工程系,四川 自贡 643000)

摘 要:采用Client/Server模式,设计了网络实时通信系统的网络结构和运行方式,并以VC++为开发工具,通过调用Winsock,实现了服务器端和客户端之间实时数据的通信。

关键词:网络通信;Client/Server模式;Winsock;VC++

中图分类号:TP391.9 文献标识码:A

引 言

网络实时通信系统是电网仿真系统支撑平台的六大模块之一。目前引进国外系统价格比较昂贵,我们根据地区电网的具体情况,以高性能微机为硬件平台,在Windows 2000操作系统的运行环境下,以Visual C++.NET为开发工具,采用SQL Server 2000建立静态数据库,实现了静态数据库管理、实时数据库管理、系统运行管理与控制、模型开发支撑、图形仿真和网络实时通信等功能,满足了电网仿真的需要。

1 系统网络结构方案

根据电网仿真系统支撑平台的实际要求,系统网络结构采用了Client/Server模式,Client/Server技术是当今世界上最流行与最具发展的技术之一,以之构成的应用系统具有系统结构优化、资源利用率高、整体运行速度快的优点。当然这种高效率的系统是以其高效率服务器客户机交 的网络通信为先决条件的。因此,产生了Windows环境下的标

换 准的TCP/IP网络开发界面,利用Socket技术开发网络通信程…...机 工控机序。本实时通信系统包括仿真主机与监控机之间、仿真主机与

客户机接口机之间的实时通信。采用总线型的网络拓扑结构,以交换

硬件盘台及设备机代替总线,以1000M以太网连接各个计算机。其系统网络

图1系统网络结构图 结构如图1所示。

2 系统网络运行方式

如图2所示,模型程序在服务器计算机上运行,它与以服务器方式运行的在线调试程序和网络实时

通信程序通过变量数据库管理动态连接库共享内存;在客户机上以客户方式运行的网络通信程序,通过网络设备与服务器上的网络通信程序建立网络连接后,首先利用变量数据库管理系统建立服务器数据内存映象,然后通过与以客户机方式运行的调试程序共享此内存映象。然后通过与网络通信程序配合,在客户机上运行的调试程序可以如同在本机一样对模型程序进行数据显示和在线调试。

为了保持服务器和所有客户机的数据同步,一个最简单的办法就是在服务器和客户机之间进行定期的数据复制,但这样会使网络负荷加重,数据传输的效率受到限制。考虑到每个监控机上所需变量数量

收稿日期:2006-03-14

作者简介:丁 忠(1969-),男,四川荣县人,高级教师,主要从事计算机、电子仿真领域的研究。

第19卷 第5期 丁 忠等:基于VC++的网络实时通信系统的设计与实现 67 远小于变量数据库中的变量,所 以没有必要总是把所有数据进行传送,为此,只需把实时数据都保存在服务器上,客户机每隔一定的时间间隔,取得所有显示画面的变量,然后向服务器发送索取这些变量的申请,服务器得到申请之后,马上把所需数据发送到客户机。客户机对某个变量进行了修改后,马上向服务器发送修改变量的申请,服务器接到后,即把相应变量改为给定值。这样有选择的发送数据,减少了通信量。

服务器计算机 调试程序 (服务器方式) 客户计算机 调试程序 (客户方式) 变量数据库 模型程序管理动态连接库 变量数据库 管理动态连接库 (服务器方式) (客户方式) 网络设备网络通信程序 网络通信程序 (服务器方式) (客户方式) 图2 网络通信模式3 编程接口Winsock

3.1 网络编程接口Winsock

Windows Sockets是Microsoft Windows的网络程应用程序1 应用程序2 序设计接口,它是从UNIX系统上Berkeley sockets扩展而来的。Windows Sockets在继承了Berkeley sockets

网络编程接口(如Windows Sockets) 必要特征的基础上,又对它进行了重要的扩充,增加

了一些符合Windows环境消息驱动特性的函数。

Windows环境与UNIX环境有很多不同,它是基网络通信协议服务接口(如TCP/IP) 于消息传递机制的非抢先式多任务操作系统。Windows内核负责把消息队列中的每条消息转发给特定的处理

操作系统(如Windows) 程序,处理程序接受到消息后,从Windows内核接过系统控制权,根据消息内容进行相应处理,直到处理

物理通信介质 完毕才把系统控制权交给Windows内核。而传统的

Sockets采用的是同步方式,即阻塞的传输方式,这样,

图3应用程序和Sockets的关系一旦Read()被阻塞,CPU控制权会被应用程序长期占

有,Windows内核得不到控制权,就无法完成对消息

的调度工作,出现死机。扩充的Sockets API中提供了基于消息的对网络事件异步访问的函数,充分利用了Windows的优点,其中最主要的是异步多路复用调用。

Winsock规范定义了一个TCP/IP网络开发Windows程序的接口标准,它以DLL来实现Socket接口。Winsock在Windows编程环境下所处的位置如图3所示。Winsock位于TCP/IP协议栈和应用程序之间,管理与TCP/IP协议的接口。程序利用Winsock及其对底层硬件(串行口或网卡)的控制,来实现网络通信。利用Winsock编制网络通信程序,依赖于程序建立的网络连接类型(面向连接的还是无连接的)和程序的作用(客户进程还是服务器进程)。 3.2 面向连接协议Winsock的调用

基于TCP/IP协议的应用程序通常采用Client/Server模式,必须由客户和服务器两个进程共同完成应用任务。客户和服务器之间的数据传输采用面向连接(如TCP)或无连接(如IP)的通信协议。本网络实时通信系统采用了面向连接的通信协议,服务器必须首先启动,直到它执行完Accept()调用,进入等待状态后,方能接受客户请求,如图4所示,假如客户在此之前已启动,则Connect()将返回出错代码,连接不成功。

68 四川理工学院学报(自然科学版) 2006年10月

4 服务器端与客户端之间实时通信程序实现

为了减少网络流通量,对于要传输的数据,定义其网络数据结构如下: typedef union DATA {

int iValue;

float fValue; bool bValue; }VALUE; Socket()typedef struct CrtDbRecord { Bind()unsigned short ID;//变量ID

unsigned short Type;//变量类型 VALUE Data;//变量值 }Tosend;

根据上述数据结构组织网络通信数据,实现了服务器端和客户端的程序开发,分别如表1和表2所示。

表1 服务器端函数

函 数 名

返回值类型

函数说明

Listen()Accept()Socket()阻塞、等待客户连接请求 建立连接 Connect()OnInitDialog() BOOL Socket初始化 thread(LPVOID p)

UINT

接收线程

Read()服务请求 Write()senddata() void 发送数据

处理服务请求表2 客户端端函数

函 数 名

返回值类型

函数说明

Write()服务应答 Read()Connectserver() void 连接服务器 thread(LPVOID p)

UINT

接收数据线程

图4 面向连接的Socket senddata() void 数据发送

5 网络实时通信系统实现中的几个关键问题

5.1 服务器并发请求处理

在该系统中,服务器须处理多个客户机连接的并发请求。本系统假设服务器的最大连接数为十个,为此,在服务器程序中初始化了十个不同的CSocket类派生的套接字。在服务器程序开始运行就对设定的端口进行监听,监听到的连接请求交由应用程序一个线程接收连接请求,若连接成功,则占用一个套接字进行数据的发送和接收工作,同时启动下一个线程接收连接请求。如此类推直到十个套接字用完为止。当然,处于连接状态的套接字若处理完数据的发送和接收工作则会立即关闭连接、中止线程以释放资源,以便下一个客户端的连接。在处理监听连接时,服务器的监听套接字不需要重复创建,只需要一个监听套接字在服务器程序开始运行就对设定的端口进行监听即可,对于监听到的连接请求由应用程序处理。应用程序对连接请求分派一个套接字,用于连接和传输数据,用一个连接列表管理所有的客户机与服务器的连接,通过扫描该连接列表的各个成员,可以获取对它们的状态或更新客户机的数据信息。 5.2 短信息流动态刷新

在同一时刻,系统中可能存在多个结点(工控机或客户机)需要发送采集或计算出的数据信息。如采用全部变量数据同时传输的信息流形式,瞬时通信量将很大,通信延时将增加,为了保证通信的可靠与速度,本通信系统采用了称为短信息流的实时数据动态刷新技术。在每台计算机内存中都保存有先前

第19卷 第5期 丁 忠等:基于VC++的网络实时通信系统的设计与实现 69 的数据(全部完整的信息),用于多处理进程间共享。短信息流只传递变化的动态数据,当Socket有信息送达后,发出数据到达消息,通信进程接受变化的实时数据,并同步刷新共享数据内存。此分布共享模式减少了通信量(不传递大量的未发生变化的数据信息),提高了网络通信能力。

[3]

5.3 内存数据库

动态链接库是Windows中被称为非任务化的可执行模块的一种特殊程序单元,它们由调用者的任务驱动。静态链接是由连接程序将静态链接库中的函数或资源在连接时拷贝给每个运行程序,动态链接相对静态链接而言,动态链接仅将动态链接库在内存中装入一次,多任务环境下使用DLL可以节约内存,提高程序的执行效率。内存映射文件可以实现多个进程间的通信。利用动态链接库和内存映射文件建立系统运行的实时变量数据库(内存数据库),内存映射文件在内存中开辟了一个大的结构数组空间,即内存数据库,通过动态链接库提供的接口函数实现对内存数据库的读写、查询和管理等功能。

利用传统数据库管理数据的优点,先将变量的数据存储在传统数据库表格中(SQL Server 2000表),当系统运行时,再把变量从传统数据库中装载到共享内存中,模型程序运行时通过数据库接口函数和共享内存中的变量进行交互。经过上述操作既保证了数据的共享性、独立性、完整性和安全性,又节约了内存,保证了系统的响应速度。

[4]

5.4 多缓冲与同步锁

本机进程间及多机间同时存在着双向的信息流,为了处理并发的消息(进程间消息,Socket消息等),通信进程采用多线程的运行模式(多任务并发由操作系统提供支持)。多线程包括:主线程消息过滤分发、Socket接收(写内存段)、Socket发送(读内存段)、界面显示线程等。各线程与相应的内存缓冲区域交换信息,称为多缓冲。采用多缓冲保证了仿真通信数据的可靠传递。 由于消息在不同进程间处理的系统延时(由操作系统及程序的时序决定延时长短),会发生内存的读写冲突,如数据处理进程正在读“内存段”时,通信进程接收到新信息需进行“内存段”的写,等等。系统不允许数据的丢失,因此必须在“写”或“读”同一内存信息时采用同步机制,这就是设置同步锁。同步锁可靠地实现临界数据的读时保护与写时保护,消除了不同程序间信息处理不一致的影响,保证了仿真数据得到全部处理。

6 结束语

本文对电网仿真系统支撑平台中的网络实时通信系统进行了设计与实现,以1000M以太网连接各个计算机,网络通讯采用Client/Server的方式运行,通过通用网络编程接口Winsock,以Visual C++. NET为开发工具,实现了仿真主机与监控机之间、仿真主机与接口机之间的数据通信,满足了地区电网仿真计算和实时监控中毫秒级的实时性要求。 参 考 文 献:

[1] 吕崇德.大型火电机组系统仿真与建模[M]. 北京: 清华大学出版社,2002.

[2] 汪晓平.Visual C++ 6.0网络通信协议分析与应用实现[M].北京: 人民邮电出版社, 2003. [3] 屈小勇, 陈 辉. 基于Windows NT的实时仿真支撑软件系统[J]. 计算机应用, 2002,22(4): 64-66. [4] 周建华. 大型仿真系统中的实时通信技术[J]. 计算机工程, 2002,28(9): 11-12.

Design and Realization of Network Real-Time Communicating

System Based on VC++

DING Zhong,SUN Zhi-hong,LEI Yue-yun

(Electronics and Information Engineering Dept., Sichuan University of Science & Engineering, Zigong 643000, China)

Abstract: Adopting the Client/Server mode, the network structure and the operating mode of the network real-time communicating system are designed in the paper. Through Winsock, the real-time data communicating is realized between server and client by the tool of VC.

Key words: network communicating; Client/Server mode; Winsock; VC++

因篇幅问题不能全部显示,请点此查看更多更全内容

Top