熊輝 陳晶晶 王焱
摘 要: 為了營造良好的機(jī)房教學(xué)氛圍,提高教學(xué)質(zhì)量與效率,研究了基于局域網(wǎng)的進(jìn)程控制系統(tǒng)。介紹了軟件的一些關(guān)鍵技術(shù),并對(duì)基于局域網(wǎng)的進(jìn)程控制軟件的理論和技術(shù)進(jìn)行了深入研究。通過運(yùn)用MFC開發(fā)技術(shù),Windows消息驅(qū)動(dòng)技術(shù)、ADO和套接字通信技術(shù),采用C/S模式的系統(tǒng)體系結(jié)構(gòu),實(shí)現(xiàn)了滿足機(jī)房需求的基于局域網(wǎng)的進(jìn)程控制。
關(guān)鍵詞: MFC; SOCKET; 消息驅(qū)動(dòng); 進(jìn)程控制; C/S模式
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2015)11-16-03
Abstract: In order to create a good teaching atmosphere and improve the teaching quality and efficiency, the process control system based on LAN is studied. Some key technologies of software are introduced, and the theory and technology of process control software based on LAN are studied in this paper. Through the use of MFC development technology, Windows message-driven technology, ADO and socket communication technology, the C/S system architecture mode is adopted, and the process control system based on local area network is realized.
Key words: MFC; socket; message-driven; process control; C/S mode
0 引言
隨著計(jì)算機(jī)的普及和計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,信息化、自動(dòng)化已經(jīng)成為了這個(gè)時(shí)代的主題。其中網(wǎng)絡(luò)應(yīng)用程序發(fā)展和應(yīng)用更是為人們的生活、工作和娛樂等各方面提供了極大的便利。在各類網(wǎng)絡(luò)應(yīng)用技術(shù)中,套接字無疑是網(wǎng)絡(luò)應(yīng)用程序中極其重要的一環(huán),它是連接應(yīng)用程序和網(wǎng)絡(luò)通信協(xié)議的接口,windows socket就是其中一種。營造良好的機(jī)房教學(xué)氛圍、合理組織與管理機(jī)房教學(xué),進(jìn)而提高機(jī)房教學(xué)的質(zhì)量和效率,是眾多教育機(jī)構(gòu)亟待解決的問題。非教學(xué)進(jìn)程(如游戲等)的普及與泛濫,更是對(duì)機(jī)房的教學(xué)管理提出了嚴(yán)峻的挑戰(zhàn)。一個(gè)完備的局域網(wǎng)進(jìn)程控制系統(tǒng)不僅可以大大提高教學(xué)效率,還能促進(jìn)學(xué)習(xí)者的學(xué)習(xí)。因此,設(shè)計(jì)一個(gè)基于套接字的局域網(wǎng)進(jìn)程控制系統(tǒng)既具有理論研究的意義,又具有實(shí)際意義。
本系統(tǒng)設(shè)計(jì)采用C/S結(jié)構(gòu)設(shè)計(jì),服務(wù)器端與客戶端軟件通過套接字通信技術(shù)控制指令的傳輸,客戶端通過定時(shí)掃描客戶機(jī)上正在運(yùn)行的軟件信息,并通過查詢數(shù)據(jù)庫來判斷軟件可否運(yùn)行,服務(wù)器端可以開啟或關(guān)閉客戶端的監(jiān)控功能,也可以修改數(shù)據(jù)庫中的信息。作為在機(jī)房環(huán)境下運(yùn)行的軟件,需要應(yīng)對(duì)復(fù)雜的網(wǎng)絡(luò)環(huán)境,該軟件需要具有健全的異常處理能力和靈活的可移植性。
1 系統(tǒng)設(shè)計(jì)
1.1 系統(tǒng)架構(gòu)設(shè)計(jì)
機(jī)房實(shí)驗(yàn)教學(xué)系統(tǒng)的總體框架結(jié)構(gòu)可劃分為兩大模塊,即服務(wù)器模塊和客戶端模塊。本系統(tǒng)設(shè)計(jì)采用C/S結(jié)構(gòu)設(shè)計(jì),服務(wù)器端與客戶端軟件通過套接字通信技術(shù)進(jìn)行控制指令的傳輸,客戶端通過定時(shí)掃描客戶機(jī)上正在運(yùn)行的軟件信息,并通過查詢數(shù)據(jù)庫來判斷軟件可否運(yùn)行,服務(wù)器端可以開啟或關(guān)閉客戶端的監(jiān)控功能,也可以修改數(shù)據(jù)庫中的信息。
1.2 系統(tǒng)功能設(shè)計(jì)
1.2.1 服務(wù)器端功能模塊描述
服務(wù)器端包括登錄、數(shù)據(jù)庫連接、套接字連接、軟件信息操作、遠(yuǎn)程控制、界面設(shè)計(jì)六部分。用戶通過登錄對(duì)話框輸入用戶名和密碼,經(jīng)驗(yàn)證與數(shù)據(jù)庫數(shù)據(jù)一致方可登錄,當(dāng)連接不正確時(shí)需要提供修改連接數(shù)據(jù)庫相關(guān)的配置信息。本系統(tǒng)數(shù)據(jù)庫采用ADO(Active Data Object)技術(shù)連接SQL Server 2000數(shù)據(jù)庫,負(fù)責(zé)數(shù)據(jù)庫的連接,數(shù)據(jù)庫的增刪改查等操作,并進(jìn)行異常處理。服務(wù)器端使用套接字向客戶端發(fā)送必要的配置信息(網(wǎng)絡(luò)數(shù)據(jù)庫的地址,登錄用戶和密碼),通過特定指令開啟客戶端的屏蔽功能。
1.2.2 客戶端功能模塊描述
服務(wù)器端包括界面設(shè)計(jì)、開機(jī)自啟動(dòng)、數(shù)據(jù)庫連接、套接字連接、軟件信息掃描、監(jiān)控六部分。其中界面設(shè)計(jì)實(shí)現(xiàn)隱藏界面,在任務(wù)管理器中應(yīng)用程序中隱藏的功能;開機(jī)自啟動(dòng)通過修改注冊(cè)表使程序開機(jī)自動(dòng)啟動(dòng);數(shù)據(jù)庫連接采用ADO技術(shù)連接SQL Server 2008數(shù)據(jù)庫,負(fù)責(zé)數(shù)據(jù)庫的連接,數(shù)據(jù)庫的增刪改查等操作,并進(jìn)行異常處理;套接字連接通過套接字接收服務(wù)器發(fā)送的配置信息(網(wǎng)絡(luò)數(shù)據(jù)庫的地址,登錄用戶和密碼),接收到服務(wù)器的消息后開啟監(jiān)控服務(wù);軟件信息掃描每隔一段時(shí)間掃描當(dāng)前正在運(yùn)行的頂層窗口,獲取窗口類和標(biāo)題。通過查找數(shù)據(jù)庫確認(rèn)該窗口是否允許運(yùn)行。如果在數(shù)據(jù)庫中查找不到該窗口的信息,就將該條信息插入到數(shù)據(jù)庫中,并通過套接字通知服務(wù)器端數(shù)據(jù)庫有更新。
根據(jù)上述系統(tǒng)說明,設(shè)計(jì)出系統(tǒng)功能結(jié)構(gòu)如圖1。
[基于局域網(wǎng)的進(jìn)程控制軟件][服務(wù)器端][客戶端][登錄\&數(shù)據(jù)庫連接\&套接字連接\&軟件信息操作\&遠(yuǎn)程控制\&界面設(shè)計(jì)\&][開機(jī)自啟動(dòng)\&界面設(shè)計(jì)\&套接字連接\&數(shù)據(jù)庫連接\&軟件信息掃描\&監(jiān)控\&]
圖1 系統(tǒng)功能結(jié)構(gòu)圖
2 系統(tǒng)實(shí)現(xiàn)的關(guān)鍵技術(shù)
本系統(tǒng)開發(fā)采用了MFC編程技術(shù)[1]、套接字技術(shù)[2]和ADO數(shù)據(jù)庫訪問技術(shù)[3]這三個(gè)非常流行和成熟的技術(shù)。下面主要介紹程序設(shè)計(jì)、服務(wù)器端功能的實(shí)現(xiàn)和客戶端功能的實(shí)現(xiàn)所涉及到的關(guān)鍵技術(shù)。
2.1 程序設(shè)計(jì)
該系統(tǒng)在MFC應(yīng)用程序框架的基礎(chǔ)上設(shè)計(jì)實(shí)現(xiàn),其中大部分功能仍是通過調(diào)用最基本的Win32 API來實(shí)現(xiàn)。程序的進(jìn)行是依靠外部事件來驅(qū)動(dòng),Windows時(shí)刻監(jiān)視用戶的一舉一動(dòng),并分析用戶的動(dòng)作,將用戶的動(dòng)作以消息的形式發(fā)送給對(duì)應(yīng)的程序,應(yīng)用程序從消息隊(duì)列中去除消息并分析,采取適當(dāng)?shù)膭?dòng)作來響應(yīng)用戶的操作[4]。
2.2 服務(wù)器端功能的實(shí)現(xiàn)
2.2.1 界面設(shè)計(jì)
界面框架的選擇主要有兩種方式:基于單文檔的程序和基于對(duì)話框類型的程序。結(jié)合這兩種框架的優(yōu)缺點(diǎn),本軟件的服務(wù)器端需要與管理員(教師)進(jìn)行較多的交互,對(duì)數(shù)據(jù)的處理由數(shù)據(jù)庫負(fù)責(zé),因此選擇基于對(duì)話框的框架更適合。
⑴ 主界面設(shè)計(jì)
用戶登錄成功后顯示主界面,列表每行前有一個(gè)勾選框,選中表示該類軟件禁止運(yùn)行,未選中表示允許運(yùn)行。對(duì)列表中的信息進(jìn)行修改后點(diǎn)擊刷新按鈕將修改的內(nèi)容更新到數(shù)據(jù)庫中。點(diǎn)擊開啟按鈕通知客戶端開啟監(jiān)控功能,點(diǎn)擊應(yīng)用按鈕通知客戶端數(shù)據(jù)庫有更新,應(yīng)用按鈕初始化為不可用,當(dāng)單擊開啟按鈕后,才使應(yīng)用按鈕可用。用戶也可以在右上角的編輯框中輸入關(guān)鍵詞從數(shù)據(jù)庫中搜索類似的軟件信息并且在列表中顯示。
⑵ 用戶管理界面
采用模態(tài)對(duì)話框形式顯示用戶管理界面對(duì)話框,如果登錄用戶為管理員,則可以對(duì)用戶信息進(jìn)行管理。如果登錄用戶為普通用戶則只可以修改自己的用戶信息。
2.2.2 登錄
運(yùn)行本軟件后首先彈出該登錄對(duì)話框,對(duì)應(yīng)CLoginDlg類。通過單擊設(shè)置按鈕可以顯示查看更多內(nèi)容,并可以對(duì)相關(guān)信息進(jìn)行修改,數(shù)據(jù)庫地址、數(shù)據(jù)庫登錄名、數(shù)據(jù)庫密碼、廣播地址、本地端口和客戶端端口的內(nèi)容初始讀取自ini配置文件,當(dāng)通過該對(duì)話框?qū)?nèi)容進(jìn)行了修改后也及時(shí)修改該ini配置文件。當(dāng)單擊登錄按鈕后首先檢查登錄名和密碼是否填寫,如果未填寫則需提示用戶。符合要求后可以登錄,如果連接數(shù)據(jù)庫出現(xiàn)異常,將彈出設(shè)置對(duì)話框。連接成功后,查找用戶表,如果找到該用戶并且密碼正確則登錄成功,該登錄對(duì)話框關(guān)閉,彈出主界面,否則提示用戶名或密碼錯(cuò)誤。
2.2.3 數(shù)據(jù)庫連接
采用ADO技術(shù)連接網(wǎng)絡(luò)數(shù)據(jù)庫SQL 2000,通過對(duì)象模型Connection從應(yīng)用程序中訪問數(shù)據(jù)源,連接時(shí)所使用的用戶名和口令等信息從配置文件中讀取。通過對(duì)象模型Command對(duì)已建立連接的數(shù)據(jù)源進(jìn)行指定的操作。通過對(duì)象模型Recordset將查詢結(jié)果存儲(chǔ)在本地,這些數(shù)據(jù)以行為單位。在默認(rèn)情況下,Visual C++不支持ADO對(duì)象,要在程序中使用ADO對(duì)象,需要使用#import命令將ADO庫文件msado15.dll導(dǎo)入到工程中。通過該庫中的_ConnectionPtr、_CommandPtr、_RecordserPtr三種接口為數(shù)據(jù)庫的連接、增加、刪除、查找和修改提供接口。數(shù)據(jù)庫的連接應(yīng)遵循最遲連接和最早斷開的原則[5]。異常處理方式為等待用戶修改連接字。
2.2.4 套接字通信
本軟件采用基于套接字進(jìn)行通信,用于客戶機(jī)與服務(wù)器端軟件信息的及時(shí)交流,控制。套接字類型采用符合Windows消息驅(qū)動(dòng)特性的網(wǎng)絡(luò)事件異步選擇機(jī)制的類型,基于消息驅(qū)動(dòng)機(jī)制的異步程序,基于套接字通信中,套接字的接收處理時(shí)一個(gè)阻塞函數(shù),因此如果沒有接收到消息,該函數(shù)會(huì)處于等待狀態(tài)而不會(huì)馬上返回,使整個(gè)程序阻塞[6]。
2.2.5 軟件信息操作
通過數(shù)據(jù)庫連接對(duì)象將結(jié)果插入到LISTCTRL控件中,連接采用recordset提供的open函數(shù),該方式的效率比connection連接方式快。控件提供CHECKBOX風(fēng)格,結(jié)果中表示已禁止的行為勾選狀態(tài),是用戶通過點(diǎn)擊checkbox設(shè)置是否禁止該項(xiàng)。由于LISTCTRL控件支持的編輯功能只對(duì)第一列有效,因此通過獲取鼠標(biāo)雙擊區(qū)域的行列號(hào)并在該位置覆蓋一個(gè)編輯框達(dá)到類似效果。列表中類型列的設(shè)置采用彈出菜單的方式,使用戶通過鼠標(biāo)方便的為軟件分類。
2.3 客戶端功能的實(shí)現(xiàn)
本軟件客戶端需要隱藏自己的主界面,目的是讓用戶無法關(guān)閉該程序, 軟件的主窗口在初始化時(shí)被設(shè)置為SW_HIDE風(fēng)格。當(dāng)軟件運(yùn)行時(shí),在任務(wù)欄和任務(wù)管理器中的應(yīng)用程序中都看不到該軟件。軟件會(huì)采用開機(jī)自啟動(dòng),把程序拷貝到系統(tǒng)目錄,并改名為NETMANAGE.EXE。和服務(wù)器采用相同的方式連接數(shù)據(jù)庫。異常處理方式為重新運(yùn)行程序并等待服務(wù)器指令。采用與服務(wù)器相同類型的套接字,為使服務(wù)器和客戶端能在同一機(jī)器上運(yùn)行,綁定的端口號(hào)應(yīng)與服務(wù)器的不一樣。應(yīng)用程序每秒掃描一次,為提高系統(tǒng)的執(zhí)行效率,不采用遍歷所有桌面窗口的方式,考慮到掃描頻率和機(jī)房電腦的數(shù)量,本系統(tǒng)只掃描正在運(yùn)行的桌面頂層窗口。為進(jìn)一步減少數(shù)據(jù)庫的訪問,當(dāng)檢測到當(dāng)前頂層窗口和上一秒是相同的,則表示該窗口未被禁止,因此不再繼續(xù)訪問數(shù)據(jù)庫。當(dāng)窗口發(fā)生變化時(shí)重新開始訪問并查找數(shù)據(jù)庫。當(dāng)未查詢到相關(guān)信息時(shí),采用樂觀加鎖的方式將該信息插入到數(shù)據(jù)庫當(dāng)中,即僅在調(diào)用Update方法時(shí)鎖定記錄[7]。
3 結(jié)束語
通過一系列的測試表明,本軟件能在局域網(wǎng)中有效地發(fā)現(xiàn)客戶端上運(yùn)行的程序,服務(wù)端經(jīng)過設(shè)置后能有效的控制客戶端上所運(yùn)行的進(jìn)程,從而控制了客戶端的進(jìn)程應(yīng)用,在一定程度上提高了局域網(wǎng)內(nèi)的管理質(zhì)量和學(xué)習(xí)氛圍。該軟件的創(chuàng)新性在于,其對(duì)網(wǎng)絡(luò)連接的靈活性、網(wǎng)絡(luò)控制的方便性和完善的異常處理能力。
該軟件通過定時(shí)掃描頂層窗口的方式來控制進(jìn)程,這并不是最優(yōu)的解決方式。另外,該軟件通過獲取窗口類名和窗口標(biāo)題來區(qū)別軟件信息,一少部分軟件特別是系統(tǒng)程序僅通過這兩項(xiàng)很難理解其是什么軟件,需要通過查閱資料才能了解。但目前,用已知的方式對(duì)此改進(jìn),需要大量的數(shù)據(jù)處理。我們將繼續(xù)研究,尋找更好的解決辦法。
參考文獻(xiàn)(References):
[1] 姚領(lǐng)田.精通MFC程序設(shè)計(jì)[M].人民郵電出版社,2006.
[2] 施煒,李錚,秦潁.Windows Sockets 規(guī)范及應(yīng)用-Windows網(wǎng)
絡(luò)編程接口[M].電子工業(yè)出版社,1996.
[3] 劉浩.Visual C++ SQL Server 數(shù)據(jù)庫應(yīng)用實(shí)例完全解析[M].
人民郵電出版社,2006.
[4] 袁翔.Visual C++實(shí)踐與提高系列叢書——網(wǎng)絡(luò)編程篇[M].
人民鐵道出版社,2001.
[5] 王珊.數(shù)據(jù)庫系統(tǒng)概論[M].高等教育出版社,2006.
[6] 葉樹華.網(wǎng)絡(luò)編程實(shí)用教程[M].人民郵電出版社,2010.
[7] 鄭若忠.數(shù)據(jù)庫原理[M].國防科技大學(xué)出版社,1998.