摘 要:在闡述了軟件在線自動升級的功能特點的基礎上,詳細地介紹了通用升級程序的設計以及實現原理。該系統采用了I/O網絡模型以及加密技術,能夠自動、及時、準確地對客戶使用產品進行穩定的升級。
關鍵詞:自動升級;多線程; I/O模型
中圖分類號:TP
文獻標識碼:A
文章編號:1672-3198(2010)09-0296-01
1 系統特性
1.1 安全性
安全性分為兩個部分,即服務端安全性和客戶安全性。服務端安全性主要由服務主機安全性決定,由于服務主機將存放原始版數據,因此必須確保本類數據不被竊取。
客戶端安全主要防止同一許可證多用及泄露情況。對于同一許可證,為了防止多用戶采用,升級服務程序將采用一次一密的服務方式,即本次升級時將下次升級密鑰進行約定,保證每個密鑰只能使用一次。
為了防止泄露情況,對每個客戶端發送的數據將進行處理,即在數據部分采用對無關數據進行水印方式,有效保證每個客戶端所獲得的數據功能上無差異,但可以根據最后生成的樣本等進行有效的區分。
1.2 分離性
分離性主要分為兩部分,即不同產品的分離以及不同用戶等級的分離。不同產品的分離將通過對不同的目錄進行區分來實現,即用戶將首先進行驗證,驗證成功后,升級程序根據數據庫保存內容,對相應的目錄進行處理,與用戶通訊并分離。
不同用戶等級的分離原理類似不同產品的分離,有著不同等級的用戶可以針對不同目錄進行區分。
1.3 通用性
通用性主要指升級服務程序可以對所有產品進行升級服務。這部分功能將由具體設計進行保證,使之適用于所有情況的升級服務。
2 升級程序的設計
2.1 服務器端工作流程
(1)服務器護進程監聽8167端口。
(2)有用戶連接時,創建線程進行處理。
(3)進行身份驗證,查詢數據庫與用戶提供密碼是否一致。
(4)通過驗證后,生成一個新密碼,更新數據庫并發送給用戶(*)。
(5)確認用戶產品和身份,尋找對應的目錄。
(6)確認用戶更新日期。
(7)遍歷目錄下所有的文件,依次發送文件名(*)。
(8)用戶確認是否存在此文件,如否,轉(11) (*)。
(9)發送此文件MD5,用戶確認是否一致,如否,轉(11) (*)。
(10)轉(7)。
(11)發送此文件內容(*)。
(12)轉(7)直至文件更新結束。
(13)更新數據庫中用戶相關信息。
其中,所有帶(*)號的步驟均為DES加密傳送數據。
2.2 管理程序的設計
管理程序主要負責進行客戶數據管理及日志查詢、回溯等功能。
(1)日志查詢。
查詢當日日志,本周日志,本月日志。查詢用戶登陸情況。查詢指定用戶名的更新情況。可以查詢指定產品更新情況。
(2)用戶管理。
進行用戶添加、刪除、修改管理。手工重置用戶的密碼。
(3)產品管理。
對產品進行添加、刪除、發布時間修改等管理。指定產品對應的目錄。
3 升級程序的實現
3.1 服務器端的實現
服務器端啟用WSAAsyncSelect模型對客戶端的請求進行相關響應,接收FD_ACCEPT連接通知,代碼如下:
WSAAsyncSelect(Listen,m_hWnd,WM_SOCKET,FD_ACCEPT | FD_CLOSE);
其中Listen為服務器端套接字。接收到連接請求后,服務器端相關消息響應代碼如下:
LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch( message )
{
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
Accept = ::accept(wParam, (struct sockaddr*)clientAddr, clientlen);
WSAAsyncSelect(Accept, this->GetSafeHwnd(), WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE);
break;
case FD_READ:
DWORD threadid;
HANDLE handle;
handle = CreateThread(NULL, 5000000, ThreadProc, (LPVOID)threadtemp, NULL, threadid );
CloseHandle( handle );
break;
}
}
接收到客戶端請求,開啟FD_READ, FD_WRITE,客戶端傳送數據過來時,接收到FD_READ通知,開啟線程ThreadProc,與客戶端進行數據驗證及交互。
3.1.1 版本比較
為了確實軟件產品是否需要更新,服務器端需要接收客戶端發送的升級信息。本程序將系統當前版本的信息以一定的格式寫入文件,存放于升級服務器中。同時客戶端也存在相同類型的文件以記錄客戶端的版本信息。當客戶端連接到升級服務器以后,首先將客戶端升級信息發送到服務器端,與服務器端的版本信息進行比較,然后分析出當前版本是否需要升級。
3.1.2 數據傳輸的安全性
為了保證服務器端相關程序不被竊取,本程序采用了一次一密的加密方式,即當用戶第一次更新時,會發送公司指定的用戶名密碼至服務器,此時客戶端程序同時會獲取用戶所用機器的硬件數據(機器特征值),發送到服務器端。用戶再次需要升級時,會驗證用戶名密碼以及機器的特征是否正確后才能完成升級服務。每次用戶提交給服務器的驗證結構體如下定義:
typedef struct UserInfo
{
char username[100];//用戶名
char password[100];//用戶密碼
char product[20];//更新的項目ID
char machineMD5[50];//用戶PC的唯一標識
}USERINFO,*LPUSERINFO;
machineMD5為獲取客戶機相關硬件特征值。
對于文件數據的傳輸,為避免數據泄露,均在客戶采用DES加密后進行傳送,服務器端收到數據解密后寫文件。
3.1.3 獲取更新文件列表
客戶端將產品路徑中的文件中各文件信息發送到客戶端,每個文件的結構體定義如下:
typedef struct List
{
char filepath[260];//文件的相對路徑
char md5hash[50];//文件的md5值
}FILELIST,*LPFILELIST;
md5hash變量取文件的md5值,客戶端產品路徑中的各文件的路徑及md5值與服務器端的此結構體數組進行比較,由于相同的文件具有相同的md5值,得出需要更新的文件信息。
3.2 客戶端的實現
客戶端是獨立于產品的工具,默認設置為開機自動運行的,也可以進行手動升級。如服務器開啟,客戶端連接升級服務器,并將升級服務器的版本文件與本機的版本文件相比較,若有新版本,則將服務器傳送的文件下載到本地臨時目錄下,再進行升級安裝。如果不需要升級,則提示后自行退出。升級服務器支持端點續傳功能,在客戶端下
載時,將下載文件和服務器端的文件進行大小比較,對余下的數據進行傳送。
參考文獻
[1]劉偉,耿英三.軟件自動升級系統的研制與開發[J].計算機工程與應用,2002,(15).
[2]李青森,何丕廉,董旭源.軟件系統版本自動更新功能的設計和實現[J].微處理機,2004,(1) .