一、數據結構
CNC 伺服器的數據結構主要由三部分組成:(1)一張用於管理組播地址的鍊表。組播地址由伺服器動態生成,客戶機可以向伺服器查詢任意組的組播地址。
(2)一張用於管理執行緒指針的鍊表。伺服器採用多執行緒並發處理技術,使客戶機獲得最快的回響。
(3)每個組都有一張用於管理“發布—訂閱”的數據的Hash表。由於同一時刻,系統可能存在多個生產者與消費者,數據的存入、取出速度成為伺服器性能的重要指標。Hash表可以提供比鍊表更快的數據檢索速度。Hash表中的數據項結構見DataElement :
struct DataElement
{
char strGroupName【16】;// 工作組的名稱
char strDataName【16】; // 數據的名稱
BYTE iStorageType; // 存儲類型: STORAGE_FILE 或 STORAGE_MEMORY
COleDateTimeTimeToDie; // 作廢時刻
BOOL bLock;// 鎖定標誌: TRUE 或 FALSE
DWORD dwLength; // 數據的長度
char *pchContent; // 數據內容
};
存儲類型(iStorageType)的用途:把數據全部保存在記憶體中將非常消耗伺服器的記憶體資源,在很多情況下是沒有必要的。為了提高記憶體的使用效率,伺服器僅把生命期較短或者長度較短的數據保存在記憶體中(即為STORAGE_MEMORY類型),而把生命期較長或者長度較長的數據保存在檔案中(即為STORAGE_FILE類型)。
作廢時刻(TimeToDie)的用途:客戶機發布的數據均指定了生命期,伺服器在接收到數據時即可計算出作廢時刻。伺服器將定期掃描Hash表,若發現有數據超出作廢時刻(並且沒有被鎖定),即可刪除此數據。
鎖定標誌(bLock)的用途:很多客戶機可能同時訂閱某個數據,而該數據可能已超出作廢時刻即將被刪除。為避免衝突,規定只要有客戶機訂閱數據,就用iLock標誌來鎖定此數據,直到訂閱完成後才消除鎖定。
二、多執行緒並發技術
伺服器有一個主執行緒和多個子執行緒。主執行緒負責客戶機的入連線請求,然後創建一個子執行緒來處理這個TCP連線。每個子執行緒按照CNC API的協定與客戶機通訊。由於有多個子執行緒共享伺服器中的數據,多執行緒對共享資源的同步訪問成為實現的難點。CNC 主要採用了關鍵區、互斥對象等同步手段解決這個問題。三、Winsock的使用
CNC 1.0運行於Windows 9x/NT系統下,底層的網路通訊程式用Winsock編寫。Winsock有兩種工作方式:阻塞方式和非阻塞方式。阻塞方式的優點是編程簡單,可靠性好。缺點是容易使應用程式阻塞住,不能處理其它事務。非阻塞方式是利用Windows 訊息機制實現的。優點是在數據到來的時候,系統向應用程式視窗傳送訊息,使得應用程式不必總在等待數據,提高了工作效率。缺點是在傳送和接收數據時,應用程式並不將事情做完(不阻塞),以至於應用程式要維護複雜的狀態機。鑒於阻塞方式和非阻塞方式各有優缺點,CNC 伺服器採用了混合方式。主執行緒採用非阻塞的訊息驅動方式,可以快速回響客戶機的入連線。在子執行緒中,仍採用非阻塞的訊息驅動方式接受客戶機的請求,只有在回響請求時,採用阻塞的方式一次性地完成數據的傳送或接收。