CNC 1.0运行于Windows 9x/NT系统下,底层的网路通讯程式用Winsock编写。Winsock有两种工作方式:阻塞方式和非阻塞方式。阻塞方式的优点是编程简单,可靠性好。缺点是容易使应用程式阻塞住,不能处理其它事务。非阻塞方式是利用Windows 讯息机制实现的。优点是在数据到来的时候,系统向应用程式视窗传送讯息,使得应用程式不必总在等待数据,提高了工作效率。缺点是在传送和接收数据时,应用程式并不将事情做完(不阻塞),以至于应用程式要维护複杂的状态机。
基本介绍
- 中文名:CNC伺服器设计
- 系统:运行于Windows 9x/NT系统下
- 工作方式:阻塞方式和非阻塞方式
- 特点:CNC 伺服器採用了混合方式
数据结构
CNC 伺服器的数据结构主要由三部分组成:
(1)一张用于管理组播地址的鍊表。组播地址由伺服器动态生成,客户机可以向伺服器查询任意组的组播地址。
(2)一张用于管理执行绪指针的鍊表。伺服器採用多执行绪并发处理技术,使客户机获得最快的回响。
(3)每个组都有一张用于管理“发布—订阅”的数据的Hash表。由于同一时刻,系统可能存在多个生产者与消费者,数据的存入、取出速度成为伺服器性能的重要指标。Hash表可以提供比鍊表更快的数据检索速度。Hash表中的数据项结构见DataElement :
struct DataElement
{
char strGroupName[16]; // 工作组的名称
char strDataName[16]; // 数据的名称
BYTE iStorageType; // 存储类型: STORAGE_FILE 或 STORAGE_MEMORY
ColeDateTime TimeToDie; // 作废时刻
BOOL bLock; // 锁定标誌: TRUE 或 FALSE
DWORD dwLength; // 数据的长度
char *pchContent; // 数据内容
};
存储类型(iStorageType)的用途:把数据全部保存在记忆体中将非常消耗伺服器的记忆体资源,在很多情况下是没有必要的。为了提高记忆体的使用效率,伺服器仅把生命期较短或者长度较短的数据保存在记忆体中(即为STORAGE_MEMORY类型),而把生命期较长或者长度较长的数据保存在档案中(即为STORAGE_FILE类型)。
作废时刻(TimeToDie)的用途:客户机发布的数据均指定了生命期,伺服器在接收到数据时即可计算出作废时刻。伺服器将定期扫描Hash表,若发现有数据超出作废时刻(并且没有被锁定),即可删除此数据。
锁定标誌(bLock)的用途:很多客户机可能同时订阅某个数据,而该数据可能已超出作废时刻即将被删除。为避免冲突,规定只要有客户机订阅数据,就用iLock标誌来锁定此数据,直到订阅完成后才消除锁定。
多执行绪技术
伺服器有一个主执行绪和多个子执行绪。主执行绪负责客户机的入连线请求,然后创建一个子执行绪来处理这个TCP连线。每个子执行绪按照CNC API的协定与客户机通讯。由于有多个子执行绪共享伺服器中的数据,多执行绪对共享资源的同步访问成为实现的难点。CNC 主要採用了关键区、互斥对象等同步手段解决这个问题。
Winsock
鑒于阻塞方式和非阻塞方式各有优缺点,CNC 伺服器採用了混合方式。主执行绪採用非阻塞的讯息驱动方式,可以快速回响客户机的入连线。在子执行绪中,仍採用非阻塞的讯息驱动方式接受客户机的请求,只有在回响请求时,採用阻塞的方式一次性地完成数据的传送或接收。